Можно ли использовать один сериализатор модели для нескольких моделей с одинаковыми полями? Django Rest Framework
У меня есть 5 моделей с одинаковыми полями, которые наследуются от базовой модели. Теперь для всех пяти моделей у меня есть 5 сериализаторов, сериализующих все поля для соответствующих моделей. Пример настройки приведен ниже
базовая модель
class BaseModel(models.Model):
field 1
field 2
** модель 1**
class Model1(BaseModel):
field 3 = models.Charfield(choices=CHOICES)
модель 2
class Model 2(BaseModel)
field 3 = models.Charfield(choices=CHOICES)
Итак, поле3 является общим в обеих моделях, но в них есть разные варианты выбора, поэтому они помещены в разные модели, а не в базовую модель.
сериализатор
class SerialModel1(serializers.ModelSerializer):
class Meta:
model = Model1
fields = "__all__"
class SerialModel2(serializers.ModelSerializer):
class Meta:
model = Model2
fields = "__all__"
Как показано на рисунке, даже когда модели имеют одинаковые поля, мне нужно использовать разные сериализаторы моделей.
Вопрос
Могу ли я иметь только один сериализатор модели для Model1 и Model2? Если да, пожалуйста, подскажите, как это сделать.
You can create a generic BaseModelSerializer [drf-doc] for this:
class BaseModelSerializer(serializers.ModelSerializer):
class Meta:
fields = '__all__'
and then use this as base class for the serializers of the concrete models:
class SerialModel1(BaseModelSerializer):
class Meta:
model = Model1
class SerialModel2(BaseModelSerializer):
class Meta:
model = Model2
This will inherit the fields specification, and override the model, so effectively configuring a serializer for the respective model, but reusing the field specification.
You can of course extend the BaseModelSerializer with extra fields, or override fields if necessary.
Note that normally a ModelSerializer is in fact already a "generic" serializer, in the sense that it can serialize any model you specify in the Meta class. So in a way, using a BaseModelSerializer is "overengineering" a bit, but it can prevent repeating code.