首页 文章

根据模型字段值动态创建序列化程序

提问于
浏览
0

我有一个这样的模型:

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

当我对其进行序列化时,我希望serierizer根据“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 回答

  • 1

    你可以覆盖序列化器的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

    您可以将序列化程序的每个字段声明为 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
        ...
    

相关问题