Динамически создавать сериализатор на основе значения поля модели - PullRequest
0 голосов
/ 10 декабря 2018

У меня есть такая модель:

class A:
    name = models.CharField()
    group = models.ForeignKey('SomeModel', null=True, blank=True)

Когда я сериализую это, я бы хотел, чтобы сериализатор имел разные форматы в зависимости от того, является ли поле 'group' пустым или нет.Конечно, этого можно добиться, используя разные сериализаторы для разных форматов и вызывая их по мере необходимости в слое View:

class TypeASerializer(serializers.ModelSerializer)

    class Meta:
        model = A
        fields = ('id', 'name')

class TypeBSerializer(serializers.ModelSerializer)

    class Meta:
        model = A
        fields = ('id', 'name', 'group')

Но я хотел обработать его в самом слое сериализатора и иметь для этого один сериализатор,Это возможно?

Ответы [ 2 ]

0 голосов
/ 10 декабря 2018

вы можете переопределить методы get_fields сериализатора

class YourSerializer(serializers.ModelSerializer):
   id = serializers.SerializerMethodField()
   name = serializers.SerializerMethodField()
   group = serializers.SerializerMethodField()

   class Meta:
      model = A
      fields = ('id', 'name', 'group')

   def get_fields(self):
      fields = super().get_fields()
      # delete all the unnecessary fields according to your logic.
      if self.instance.group:  # if this is detials view other wise pass object in context
         del fields['group']
      return fields 
0 голосов
/ 10 декабря 2018

Вы можете объявить каждое поле вашего сериализатора как SerializerMethodField следующим образом:

class YourSerializer(serializers.ModelSerializer):
    id = serializers.SerializerMethodField()
    name = serializers.SerializerMethodField()
    group = serializers.SerializerMethodField()

    class Meta:
        model = A
        fields = ('id', 'name', 'group')

    def id(self, obj):
        if yourcondition(obj.group):
            return obj.id
        return another_value
    ...
...