Можно ли наследовать ModelSerializer и объединять модели

Я пытаюсь унаследовать UserCreatePasswordRetypeSerializer от djoser'а

Моделью модельного сериализатора Djoser является User. Дочерний сериализатор, который я реализую, представляет другую модель, Customer.

Так можно было бы сделать:

class CustomerSerializer(UserCreatePasswordRetypeSerializer):
     class Meta:
        model=Customer
        fields = ('customer_name',)+UserCreatePasswordRetypeSerializer.Meta.fields

Когда я делаю это django жалуется, потому что модель Customer не имеет полей модели, которые есть у User.

это модель клиента, но эта модель точно представляет эту модель.

 class Customer(models.Model):
        customer_name = models.CharField(max_length=255) 
        user = models.ForeignKey(User,on_delete=models.CASCADE,related_name='user')

Решит ли эту проблему передача User в качестве родительского класса?

class Customer(User):
        customer_name = models.CharField(max_length=255) 

будет ли это работать с унаследованными ModelSerializers.

Поскольку Djoser - это приложение, я не могу изменить UserCreatePasswordRetypeSerializer под свои нужды.

Я могу либо унаследовать это, либо

это второй подход, о котором я думал.

создайте нечто подобное,

class CustomerSerializer(serializers.ModelSerializer):
    
    user=UserCreatePasswordRetypeSerializer
    class Meta:
        fields = ('customer_name','user')

поскольку это вложенный сериализатор, мне придется самому написать метод create.

Проблема в том, как я могу вызвать метод create UserCreatePasswordRetypeSerializer в методе create, который я реализую, потому что мне нужно использовать метод create UserCreatePasswordRetypeSerializer, поскольку он обрабатывает отправку электронной почты и все другие функции в сериализаторе. Поэтому я не могу просто взять проверенные данные пользователя и создать объект пользователя в методе создания CustomerSerializer'а, как например:

user_validated_data=validated_data.pop('user')
User.objects.create(**user_validated_data).

Мне нужно вызвать метод create из UserCreatePasswordRetypeSerializer, но поскольку я не наследую этот Serializer, я не могу просто вызвать super().create(user_validated_data).

Опять же, я не могу наследовать его, потому что Child и Parents представляют разные модели.

Решит ли эту проблему передача User в качестве родительского класса?

Да. Когда Customer наследует User, он получит все поля, которые есть у User.

Однако вопрос в том, нужно ли это. Нужны ли сериализатору все поля User для работы? Если нет, или, возможно, даже если да, то эффективнее будет просто добавить необходимые поля в Customer напрямую.

Помните, что когда Customer наследует User, каждый Customer созданный вами экземпляр также создаст экземпляр User. И когда вы делаете запрос к экземпляру Customer, Django будет делать JOIN на таблице User, чтобы получить необходимые поля - как описано в документации в разделе multi-table inheritance. Иногда это полезно, иногда мешает эффективности базы данных - все зависит от конкретного случая использования, количества столбцов, того, насколько хорошо вы проиндексировали свои таблицы, и так далее.

Мое предложение - добавить все поля, которые требует сериализатор, в Customer, а затем приступить к первоначальной попытке:

# serializers.py
class CustomerSerializer(UserCreatePasswordRetypeSerializer):
     class Meta:
        model=Customer
        fields = ('customer_name', # + other necessary fields) 
Вернуться на верх