Django-REST序列化RelatedField

时间:2014-01-29 19:27:54

标签: django serialization django-models django-rest-framework

我正在尝试使用在文档(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',
                  )

1 个答案:

答案 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文档