Django rest_framework关系

时间:2014-01-20 15:39:30

标签: python django rest django-rest-framework

所以我在看django rest_framework relatedfield,我提出了一个关于使用以下架构序列化模型的问题:

class FooBar(models.Model):
    foo_flag = models.BooleanField(default=False)
    foo = models.Foreignkey(Foo, null=True, blank=True)
    bar_flag = models.BooleanField(default=False)
    bar = models.Foreignkey(Bar, null=True, blank=True)
    #...

如果我的FooSerializerBarSerializer为空,则无法致电我。我考虑使用serializer method fields创建我的FooBarSerializer

class FooBarSerializer(serializers.ModelSerializer):
    foo = serializers.SerializerMethodField('foo_info')
    bar = serializers.SerializerMethodField('bar_info')

    class Meta:
        model = FooBar

    def foo_info(self, obj):
        if obj.foo_flag:
            return FooSerializer()
        else:
            return False

    def bar_info(self, obj):
        if obj.bar_flag:
            return BarSerializer()
        else:
            return False

但是我不知道在SerializerMethodFieldRelatedField方面是否确实存在后端差异。 在这种情况下最佳做法是什么?

1 个答案:

答案 0 :(得分:1)

尝试:

class FooBarSerializer(serializers.ModelSerializer):
    class Meta:
        model = FooBar
        depth = 1

看起来你是在嵌套序列化之后,其中序列化的FooBar包含Foo和Bar模型的序列化表示。反过来,这将使用serializers.ModelSerializer序列化Foo和Bar。

如果您需要自定义Foo或Bar的序列化,那么您已经完成了创建FooSerializerBarSerializer类的正确选择。现在你需要将它们附加到FooBarSerializer,所以试试这个:

class FooBarSerializer(serializers.ModelSerializer):
    foo = FooSerializer(required=False)
    bar = BarSerializer(required=False)

    class Meta:
        model = FooBar

进一步阅读:

  • depth属性documentation
  • required=False嵌套documentation
  • 这是允许与嵌套序列化器建立空关系的issue,它自2.1.14以来一直在REST框架中。