"إذا أراد العامل أن يؤدي عمله بشكل جيد، فعليه أولاً أن يشحذ أدواته." - كونفوشيوس، "مختارات كونفوشيوس. لو لينجونج"
الصفحة الأمامية > برمجة > كيفية التعامل بكفاءة مع تعيين المفاتيح الخارجية في المسلسلات المتداخلة باستخدام إطار عمل Django REST؟

كيفية التعامل بكفاءة مع تعيين المفاتيح الخارجية في المسلسلات المتداخلة باستخدام إطار عمل Django REST؟

تم النشر بتاريخ 2024-11-16
تصفح:930

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

تعيين المفاتيح الخارجية مع التسلسلات المتداخلة في Django REST Framework

يوفر Django REST Framework (DRF) طريقة ملائمة لإدارة علاقات المفاتيح الخارجية في بيانات متسلسلة. ومع ذلك، قد يكون الحصول على السلوك المطلوب في المُسلسلات المتداخلة أمرًا صعبًا.

تعيين المفتاح الخارجي في المُسلسلات المتداخلة

ترث المُسلسلات المتداخلة سلوك المُسلسلات الأصلية. افتراضيًا، لا تسمح بالتخصيص المباشر للمفاتيح الخارجية أو تعديلها. للتغلب على هذه المشكلة، تتمثل الطريقة الشائعة في تحديد حقل إضافي لمعرف المفتاح الخارجي. ومع ذلك، يمكن أن يؤدي هذا إلى تطوير واجهة أمامية غامضة.

الحلول البديلة

1. طريقة to_representation () المخصصة:

أحد الحلول هو تجاوز طريقة to_representation () للمتسلسل الأصلي. يسمح هذا بتضمين بيانات مخصصة في الاستجابة المتسلسلة.

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

يضمن هذا الأسلوب تمثيل المفتاح الخارجي ككائن تسلسلي متداخل، مما يتيح الإنشاء والقراءة باستخدام نفس المفتاح.

2. حقل بديل مرتبط:

الحل الأكثر عمومية هو إنشاء حقل مُسلسِل مخصص يتصرف بشكل مختلف عن الحقل الأساسي الافتراضي.

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)

يسمح هذا الحقل بتحديد مُسلسل لتمثيل المفتاح الخارجي.

استخدام الحقل البديل ذي الصلة

يمكن بعد ذلك استخدام الحقل المرتبط بالحقل البديل في المُسلسِل الأصل كما يلي:

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

فوائد استخدام الحقل المخصص

  • يوفر سلوكًا متسقًا لـ جميع المُسلسلات التي تحتاج إلى التعامل مع المفاتيح الخارجية المتداخلة.
  • يلغي الحاجة إلى حقول إضافية للإنشاء و قراءة.
أحدث البرنامج التعليمي أكثر>

تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.

Copyright© 2022 湘ICP备2022001581号-3