ホームページ >バックエンド開発 >Python チュートリアル >入れ子になった Django REST フレームワーク シリアライザーで外部キーの割り当てを簡素化する方法
問題:
Django REST フレームワーク (DRF) では、標準の ModelSerializer を使用すると、ID を整数。ただし、ネストされたシリアライザーを使用する場合、この動作を複製するのが最善のアプローチであるかどうか疑問が生じます。
解決策:
Oneネストされたシリアライザーでこの機能を実現するには、親シリアライザーの to_representation() メソッドをオーバーライドします。この手法には次の利点があります。
to_representation() が変更されたサンプルの親シリアライザー方法:
class ParentSerializer(ModelSerializer): class Meta: model = Parent fields = '__all__' def to_representation(self, instance): response = super().to_representation(instance) response['child'] = ChildSerializer(instance.child).data return response
より一般的な解決策として、LargeFilter という名前のカスタム シリアライザー フィールドを作成することを検討してください。このフィールドは、DRF バージョン 3.x および 4.x との互換性を保証します。
カスタム シリアライザー フィールド:
from rest_framework import serializers class RelatedFieldAlternative(serializers.PrimaryKeyRelatedField): def __init__(self, **kwargs): 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): return False if self.serializer else True def to_representation(self, instance): 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__'
以上が入れ子になった Django REST フレームワーク シリアライザーで外部キーの割り当てを簡素化する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。