2014-01-29 117 views
0

我試圖用文檔(http://www.django-rest-framework.org/api-guide/relations)序列化與RelatedFields的模型,但我不斷收到AttributeError。Django-REST序列化相關字段

的錯誤:

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') 

的串行:

class FooSerializer(serializers.ModelSerializer): 

    bar1 = serializers.RelatedField() 
    bar2 = serializers.RelatedField() 

    class Meta: 

     model = Foo 
     fields = (
        'foo_id', 
        'name', 
        'zip_code', 
        'bar1', 
        'bar2', 
       ) 

回答

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序列化程序中使用該序列化程序,就像docs http://www.django-rest-framework.org/api-guide/relations#example

編輯:

這裏是反向關係的DRF文件http://www.django-rest-framework.org/api-guide/relations#reverse-relations