DRF: ネストされたシリアライザーを使用した単純な外部キーの割り当て
Django REST フレームワーク内では、標準の ModelSerializer により、ForeignKey モデルの関係の割り当てまたは変更が許可されます。 ID を整数として POST します。ただし、ネストされたシリアライザーからこの動作を抽出するのは難しい場合があります。
最も単純なネストされたシリアライザーのアプローチ
DRF は本質的にこの機能を提供していないため、カスタム シリアライザー フィールドが必要です。 :
from rest_framework import serializers class RelatedFieldAlternative(serializers.PrimaryKeyRelatedField): def __init__(self, **kwargs): # Serializer for this field self.serializer = kwargs.pop('serializer', None) if self.serializer is not None and not issubclass(self.serializer, serializers.Serializer): raise TypeError('"serializer" is not a valid serializer class') super().__init__(**kwargs) def use_pk_only_optimization(self): # Avoid using PK optimization if a serializer is provided return False if self.serializer else True def to_representation(self, instance): # Use provided serializer or default representation if self.serializer: return self.serializer(instance, context=self.context).data return super().to_representation(instance)
親シリアライザーで、この新しいフィールドを次のように使用します。
class ParentSerializer(ModelSerializer): child = RelatedFieldAlternative(queryset=Child.objects.all(), serializer=ChildSerializer) class Meta: model = Parent fields = '__all__'
この一般的なアプローチを使用すると、この機能を使用して複数のシリアライザーを簡単に処理できます。
to_representation() をオーバーライドするメソッド
あるいは、親シリアライザーの to_representation() メソッドをオーバーライドすることでもこれを実現できます。目標:
class ParentSerializer(ModelSerializer): def to_representation(self, instance): response = super().to_representation(instance) response['child'] = ChildSerializer(instance.child).data return response
この方法では、作成と読み取りに異なるフィールドを定義する必要があり、理想的ではない可能性があります。
以上がDjango REST フレームワークを使用してネストされたシリアライザーに外部キーを割り当てる方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。