Можно ли наследовать 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)