2016-10-12 21 views
0

のは、私はいくつかのモデルを持っているとしましょうBAへの参照(ただしCBを参照)、JSONのAPIの出力はこのようなものになるだろうので:参照関係の関係

{ 
    "data": [{ 
     "type": "C", 
     "id": "1", 
     "attributes": { 
      "b_field_1": "...", 
      "b_field_2": "...", 
      "c_field_1": "..." 
     }, 
     "relationships": { 
      "a": { 
       "data": { 
        "type": "A", 
        "id": "1" 
       } 
      } 
     } 
    }], 
    ... 
} 

これについてどうすればいいですか?私はすでにCのための私のシリアライザ内でこのような何かをやってみました:

A = ASerializer(source='my_reference_to_b.my_reference_to_a') 

しかし、DRFは、ソース用の点線のパスをサポートしていないようだと、それは、動作しません。私もソースとして(モデルはメソッド内で有効である)適切なモデルを返すメソッドを供給しようとしたが、それはとしてJSON内の参照を出力しました:私も、私のAモデルに

"a": { 
    "data": null 
} 

別のモデルDへの参照はAに明示的に記載されていませんが、代わりにDで定義されたForeignKeyのresource_nameを持つOneToMany関係(多くはDモデルから1つはAモデル)これはCのJSONにその関係を含めることもできません。私は(D = DSerializer(source='B.D')を行うことによって、それを参照しようとしている)、このエラーを取得する:

'RelatedManager' object has no attribute 'B' 

任意の助けをいただければ幸いです。

+0

DRFはドット表記をサポートしています。 http://www.django-rest-framework.org/api-guide/fields/#source。あなたのASerializerクラスに何か問題があるかもしれません。逆の一対一の関係の場合、SerializerMethodFieldを 'hasattr'チェックで使うことができます。 – xtranophilist

+0

はい、それは当てはまりますが、これまで同様のシナリオで作業していましたが、その場合はリレーション内のフィールドを参照するフィールドであり、リレーション内のリレーションではありません。それはこの場合に違いを生むようです。 – tstormk

答えて

0

私はそれを理解しました。誰かがこのページに立ち寄って助けが必要な場合に備えて、自分の質問に答えるだけです。

Django Rest Framework JSON APIのSerializerMethodResourceRelatedFieldを使用する必要があります。通常のResourceRelatedFieldを試してみましたが、ResourceRelatedFieldは点線のパスをサポートしていません。代わりに、SerializerMethodResourceRelatedFieldを使用して、目的の関係を返すメソッドを指すソースを使用します。

関連する問題