2017-07-31 2 views
0

私たちは職場でDjango Rest Frameworkを持っていますが、私は彼の次のオープンソースプロジェクトのためにDRFをやることを決めたフロントエンドの開発者です。クエリテーブルに結合テーブルのフィールドを含めるにはどうすればいいですか?

シリアライザ、モデルなどのすべてを見ることができるので、たくさんのコードをコピーして貼り付けたくないです。on GitHub

私は仕事中の開発者に尋ねました。 1つは、最初からシリアル化されたモデルを構築しているので、正しくないと思われるto_representationを上書きする必要があると述べました。作業中の他のDjango開発者は、私がcustom relation fieldsを調べることを提案しました。基本的に以下のシリアライザ与え

、どのように私は、「タイプ」(悪いという名前の)私のクエリセットでの私の参加のテーブルから列含まれます:私はのようなものを探しています擬似コードで

class UserSerializer(serializers.ModelSerializer): 
    class Meta: 
     model = User 
     fields = ('id', 'username', 'countries') 

を以下、そのユーザーを取得するときに、あなたも参加し、テーブルから多対多の関係と同様に、「タイプ」を介してうまく働いているcountriesを、関連付けられます:

class UserSerializer(serializers.ModelSerializer): 
    class Meta: 
     model = User 
     fields = ('id', 'username', 'countries', 'pinned.type') 

私は」 dは次のようなJSON応答を期待しています:

{ 
    "username": "wildhoney", 
    "countries": [ 
     { "country_id": 4, "type": 1 }, 
     { "country_id": 5, "type": 2 }, 
     { "country_id": 6, "type": 3 } 
    ] 
} 

現在のところ、私はcountry_idのリストしか受け取っていません。

答えて

1

あなたはこのようなネストされた関係を使用したいとしている:

class TrackSerializer(serializers.ModelSerializer): 
    class Meta: 
     model = Track 
     fields = ('order', 'title', 'duration') 

class AlbumSerializer(serializers.ModelSerializer): 
    tracks = TrackSerializer(many=True, read_only=True) 

    class Meta: 
     model = Album 
     fields = ('album_name', 'artist', 'tracks') 

出典:http://www.django-rest-framework.org/api-guide/relations/#nested-relationships

をだからあなたの状況に、それは次のようになります。

class PinnedSerializer(ModelSerializer): 
    class Meta: 
     model = Pinned 
     fields = ('type', 'country_id') 

class UserSerializer(ModelSerializer): 
    pins = PinnedSerializer(many=True, read_only=True) 
    class Meta: 
     model = User 
     fields = ('id', 'username', 'countries', 'pins') 

最新バージョンテスト実際のプロジェクト:

class PinnedSerializer(serializers.ModelSerializer): 
    country_id = serializers.ReadOnlyField(source='country.id') 
    class Meta: 
     model = Pinned 
     fields = ('type', 'country_id') 


class UserSerializer(serializers.ModelSerializer): 
    pinned_set = PinnedSerializer(many=True, read_only=True) 

    class Meta: 
     model = User 
     fields = ('id', 'username', 'pinned_set') 

出力:

{ 
    "id": 3, 
    "username": "bobdole", 
    "pinned_set": [ 
     { 
      "type": 1, 
      "country_id": 250 
     } 
    ] 
} 
+0

私はそれを行うとget:フィールド名 'type'が、モデル' Country'のために有効ではありません。それは 'type'が' CountrySerializer'ではなく 'PinnedSerializer'にあるからですか? – Wildhoney

+0

ああ、申し訳ありません。私は誤解しました。私は 'type'は' Country'の分野だと思った。あなたが少し後ろ向きにしているように見え、あなたの応答に 'countries'の代わりに' pins'リストが必要です。 –

+0

多分、私はそれを達成する方法がわかりません。 [ソースコードはGithubにあります](https://github.com/Wildhoney/TravelMap/tree/master/backend/api)。 '/ user/wildhoney'(これはhttps://pastebin.com/HfAEXvtj)と[これが理想的です](https://pastebin.com/zAQKh09G)のために。 – Wildhoney

関連する問題