[解決済み] DjangoのRestフレームワークでレスポンスに仲介(モデル経由)を含める。
質問
django rest フレームワークで m2m / through モデルとそのプレゼンテーションの扱いについて質問があります。古典的な例を見てみましょう。
models.py:
from django.db import models
class Member(models.Model):
name = models.CharField(max_length = 20)
groups = models.ManyToManyField('Group', through = 'Membership')
class Group(models.Model):
name = models.CharField(max_length = 20)
class Membership(models.Model):
member = models.ForeignKey('Member')
group = models.ForeignKey('Group')
join_date = models.DateTimeField()
serializers.pyを使用します。
imports...
class MemberSerializer(ModelSerializer):
class Meta:
model = Member
class GroupSerializer(ModelSerializer):
class Meta:
model = Group
views.pyを使用します。
imports...
class MemberViewSet(ModelViewSet):
queryset = Member.objects.all()
serializer_class = MemberSerializer
class GroupViewSet(ModelViewSet):
queryset = Group.objects.all()
serializer_class = GroupSerializer
MemberのインスタンスをGETすると、メンバーのすべてのフィールドとそのグループを正常に受け取ります。しかし、グループの詳細のみを取得し、Membershipモデルから来る余分な詳細は取得しません。
言い換えると、私は を期待します。 を受け取ることです。
{
'id' : 2,
'name' : 'some member',
'groups' : [
{
'id' : 55,
'name' : 'group 1'
'join_date' : 34151564
},
{
'id' : 56,
'name' : 'group 2'
'join_date' : 11200299
}
]
}
注意点として join_date .
私は非常に多くの解決策を試しましたが、その中にはもちろん Django Rest-Framework の公式ページです。 を含め、多くの解決策を試しましたが、誰もそれについて適切な答えを与えていないようです - これらの追加フィールドを含めるにはどうすればいいのでしょうか?私は django-tastypie を使ってもっと簡単な方法を見つけましたが、他の問題もあり、 rest-framework の方が好きです。
どのように解決するのですか?
どうすれば......。
MemberSerializerに、以下のようなフィールドを定義します。
groups = MembershipSerializer(source='membership_set', many=True)
で、メンバーシップ・シリアライザーでは、このように作成することができます。
class MembershipSerializer(serializers.HyperlinkedModelSerializer):
id = serializers.Field(source='group.id')
name = serializers.Field(source='group.name')
class Meta:
model = Membership
fields = ('id', 'name', 'join_date', )
これは、全体的な効果として、必要なメンバーシップをソースとするシリアライズされた値、groupsを作成し、カスタムシリアライザーを使用して表示したいビットを取り出します。
EDIT: @bryanph によってコメントされたように。
serializers.field
にリネームされました。
serializers.ReadOnlyField
に変更されました。
class MembershipSerializer(serializers.HyperlinkedModelSerializer):
id = serializers.ReadOnlyField(source='group.id')
name = serializers.ReadOnlyField(source='group.name')
class Meta:
model = Membership
fields = ('id', 'name', 'join_date', )
最新の実装の場合
関連
-
python string splicing.join()とsplitting.split()の説明
-
Python カメの描画コマンドとその例
-
FacebookオープンソースワンストップサービスpythonのタイミングツールKats詳細
-
[解決済み】numpy: true_divide で無効な値に遭遇
-
[解決済み】csv.Error:イテレータはバイトではなく文字列を返すべき
-
[解決済み】TypeError: 系列を <class 'float'> に変換することができません。
-
[解決済み】Pythonでgoogle APIのJSONコードを読み込むとエラーになる件
-
[解決済み】ImportError: bs4という名前のモジュールがない(BeautifulSoup)
-
[解決済み】ValueError: pickleプロトコルがサポートされていません。3、python2 pickleはpython3 pickleでダンプしたファイルを読み込むことができない?
-
[解決済み】「OverflowError: Python int too large to convert to C long" on windows but not mac
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
Python機械学習Githubが8.9Kstarsに達したモデルインタープリタLIME
-
Python jiabaライブラリの使用方法について説明
-
任意波形を生成してtxtで保存するためのPython実装
-
[解決済み】Python regex AttributeError: 'NoneType' オブジェクトに 'group' 属性がない。
-
[解決済み】socket.error: [Errno 48] アドレスはすでに使用中です。
-
[解決済み】TypeError: re.findall()でバイトのようなオブジェクトに文字列パターンを使用することはできません。)
-
[解決済み】"No JSON object could be decoded "よりも良いエラーメッセージを表示する。
-
[解決済み】Python elifの構文が無効です【終了しました
-
[解決済み】インポートエラー。モジュール名 urllib2 がない
-
[解決済み】「OverflowError: Python int too large to convert to C long" on windows but not mac