Можно ли использовать один сериализатор модели для нескольких моделей с одинаковыми полями? 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.
Вернуться на верх