所以我在看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)
#...
如果我的FooSerializer
或BarSerializer
为空,则无法致电我。我考虑使用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
但是我不知道在SerializerMethodField
和RelatedField
方面是否确实存在后端差异。 在这种情况下最佳做法是什么?
答案 0 :(得分:1)
尝试:
class FooBarSerializer(serializers.ModelSerializer):
class Meta:
model = FooBar
depth = 1
看起来你是在嵌套序列化之后,其中序列化的FooBar包含Foo和Bar模型的序列化表示。反过来,这将使用serializers.ModelSerializer
序列化Foo和Bar。
如果您需要自定义Foo或Bar的序列化,那么您已经完成了创建FooSerializer
和BarSerializer
类的正确选择。现在你需要将它们附加到FooBarSerializer,所以试试这个:
class FooBarSerializer(serializers.ModelSerializer):
foo = FooSerializer(required=False)
bar = BarSerializer(required=False)
class Meta:
model = FooBar
进一步阅读:
depth
属性documentation required=False
嵌套documentation