我正在尝试使用在文档(http://www.django-rest-framework.org/api-guide/relations)中使用RelatedFields序列化模型,但我不断收到AttributeError。
错误:
AttributeError at /testapi/foo/
'Foo' object has no attribute 'bar1'
模特:
class Foo(models.Model):
foo_id = models.AutoField(primary_key=True)
name = models.TextField()
zip_code = models.TextField()
class Bar(models.Model):
user = models.OneToOneField(User)
arbitrary_field1 = models.ForeignKey(Foo, related_name='bar1')
arbitrary_field2 = models.ForeignKey(Foo, related_name='bar2')
The Serializer:
class FooSerializer(serializers.ModelSerializer):
bar1 = serializers.RelatedField()
bar2 = serializers.RelatedField()
class Meta:
model = Foo
fields = (
'foo_id',
'name',
'zip_code',
'bar1',
'bar2',
)
答案 0 :(得分:0)
我对这个答案可能完全错了,因为我现在没有设置测试环境,但我会尽我所能。
好的,在测试环境中尝试过,下面的解决方案对我有用。
我不相信在这种情况下需要RelatedField,因为您只需要在字段元组中引用相关名称的任意字段指定related_name,而不是在序列化程序中使用RelateField指定它们。
所以你可能对此很好:
class FooSerializer(serializers.ModelSerializer):
class Meta:
model = Foo
fields = (
'foo_id',
'name',
'zip_code',
'bar1',
'bar2',
)
这将返回与此类似的序列化数据:
{
....
"bar1": [
1,
2,
3,
4
],
"bar2": [
1,
2,
3
]
....
}
只是旁注,但如果您不想只是关系的pk,您可以尝试将Foo序列化程序的Meta类中的深度变量设置为1或您想要的任何数字,例如来自文档http://www.django-rest-framework.org/api-guide/serializers#specifying-nested-serialization
或者,如果您想要更自定义的表示该关系,您可以为Bar模型创建一个序列化程序,包含您想要包含或排除的任何字段,并在Foo序列化程序中使用该序列化程序,就像文档中的此示例一样http://www.django-rest-framework.org/api-guide/relations#example
修改强>
以下是反向关系的http://www.django-rest-framework.org/api-guide/relations#reverse-relations
的DRF文档