「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > Django REST フレームワークを使用してネストされたシリアライザーで外部キーの割り当てを効率的に処理する方法は?

Django REST フレームワークを使用してネストされたシリアライザーで外部キーの割り当てを効率的に処理する方法は?

2024 年 11 月 16 日に公開
ブラウズ:802

How to Efficiently Handle Foreign Key Assignment in Nested Serializers with Django REST Framework?

Django REST フレームワークのネストされたシリアライザーによる外部キーの割り当て

Django REST フレームワーク (DRF) は、外部キーの関係を管理する便利な方法を提供します。シリアル化されたデータ。ただし、ネストされたシリアライザーで望ましい動作を得るのは難しい場合があります。

ネストされたシリアライザーでの外部キーの割り当て

ネストされたシリアライザーは、親シリアライザーの動作を継承します。デフォルトでは、外部キーの直接割り当てや変更は許可されていません。これを解決するための一般的なアプローチは、外部キーの ID に追加フィールドを指定することです。ただし、これにより、フロントエンド開発があいまいになる可能性があります。

代替ソリューション

1.カスタム to_representation() メソッド:

1 つの解決策は、親シリアライザーの to_representation() メソッドをオーバーライドすることです。これにより、シリアル化された応答にカスタム データを含めることができます。

def to_representation(self, instance):
    response = super().to_representation(instance)
    response['child'] = ChildSerializer(instance.child).data
    return response

このアプローチにより、外部キーがネストされたシリアライザー オブジェクトとして表現され、同じキーを使用して作成と読み取りの両方が可能になります。

2.関連フィールド代替フィールド:

より一般的な解決策は、デフォルトの PrimaryKeyEveryone フィールドとは異なる動作をするカスタム シリアライザー フィールドを作成することです。 def to_representation(self, インスタンス): self.serializer の場合: return self.serializer(instance, context=self.context).data return super().to_representation(instance)

class RelatedFieldAlternative(serializers.PrimaryKeyRelatedField):
    def to_representation(self, instance):
        if self.serializer:
            return self.serializer(instance, context=self.context).data
        return super().to_representation(instance)

RelationalFieldAlternative フィールドの使用

]次に、OtherFieldAlternative フィールドを親シリアライザーで次のように使用できます:

class ParentSerializer(ModelSerializer): child = AssociatedFieldAlternative(queryset=Child.objects.all(),serializer=ChildSerializer)

class ParentSerializer(ModelSerializer):
    child = RelatedFieldAlternative(queryset=Child.objects.all(), serializer=ChildSerializer)
カスタム フィールドを使用する利点

一貫した動作を提供しますネストされた外部キーを処理する必要があるすべてのシリアライザー。
  • 作成および読み取りのための追加フィールドの必要性を排除します。
最新のチュートリアル もっと>

免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。

Copyright© 2022 湘ICP备2022001581号-3