私は、次の標準的な一般的な外部キーフィールドを持つモデルがあります:
content_type = models.ForeignKey(ContentType)
object_id = models.PositiveIntegerField()
event_object = generic.GenericForeignKey('content_type', 'object_id')
RESTフレームワークのドキュメントによると、私はこれをシリアル化するために次の操作を行うことができますが
class WhateverSerializer(serializers.ModelSerializer):
event_object = serializers.RelatedField(source='event_object')
これはうまくいきますが、他の2つの関連する状況では正常に動作しません。
- 私は
HyperlinkedRelatedField
を使用したいと思います。このフィールドにはview_name引数が必要です。ビュー名は関連するモデルによって異なるため、宣言できません。私はSerializerMethodField
を使ってこれを解決し、実行時にHyperlinkedIdentityField
をインスタンス化し、そのfield_to_native
メソッドを返しました(以下のスニペットを参照)。これはあまりエレガントではありません。 - 私は
event_object = SoAndSoSerializer(source='event_object')
と言って、関連するオブジェクトを直接シリアル化にネストしたいと思います。私が見ることができる唯一の解決策は、私が定義した正しいモデルを持っているかどうかを確認してから、それを使用するたびに歩くことです。繰り返しますが、これはあまりエレガントではありません。
質問
はHyperlinkRelatedFieldは、一般的な関係を越えて動作することを意図しているのですか?私は間違いをしていますか? *Serializer
私は行方不明だと右のピッキングに明らかな解決策はありますか?私に
class WhateverSerializer(DefaultSerializer):
event_object_url = serializers.SerializerMethodField('get_related_object_url')
# ...
def get_related_object_url(self, obj):
obj = obj.event_object
default_view_name = '%(model_name)s-detail'
format_kwargs = {
'app_label': obj._meta.app_label,
'model_name': obj._meta.object_name.lower()
}
view_name = default_view_name % format_kwargs
s = serializers.HyperlinkedIdentityField(source=obj, view_name=view_name)
s.initialize(self, None)
return s.field_to_native(obj, None)
ソースがフィールド名と異なる場合、フィールドの 'source'引数を使用するだけでよいことに注意してください。 'event_object'の場合は削除できます。 –