البرمجة

تحديث كائنات Django متداخلة باستخدام Django Rest Framework

في برمجة تطبيقات الويب باستخدام Django Rest Framework، يعد تحدي تحديث الكائنات المدمجة داخل كائن رئيسي من التحديات الشائعة. في مشروعك، تقوم بإنشاء كائن Invoice مع كائنات InvoiceItem المرتبطة به. فيما يلي شرح مفصل لكيفية التعامل مع تحديث هذه الكائنات المدمجة في بيئة Django Rest Framework.

لتحديث الكائنات المدمجة، يجب عليك التفكير في التالي:

  1. تحديث البيانات الرئيسية للكائن الرئيسي: يجب أولاً تحديث البيانات الرئيسية لكائن Invoice.

  2. تحديث الكائنات المدمجة: بعد تحديث الكائن الرئيسي، يجب عليك الآن التفاعل مع الكائنات المدمجة، أي InvoiceItem. يمكن القيام بذلك باسترجاع الكائنات المدمجة من البيانات المحدثة وتحديثها بشكل فردي.

قم بتحديث دالة update في InvoiceSerializer كما يلي:

python
def update(self, instance, validated_data): # تحديث البيانات الرئيسية للـ Invoice instance.nr = validated_data.get('nr', instance.nr) instance.title = validated_data.get('title', instance.title) instance.save() # تحديث الـ InvoiceItems المدمجة items_data = validated_data.get('items', []) for item_data in items_data: item_id = item_data.get('id') # التحقق مما إذا كان هناك ID للـ InvoiceItem if item_id: inv_item = InvoiceItem.objects.get(id=item_id, invoice=instance) inv_item.name = item_data.get('name', inv_item.name) inv_item.price = item_data.get('price', inv_item.price) inv_item.save() return instance

هذا الكود يتيح لك تحديث الكائن الرئيسي Invoice ثم يقوم بالتحقق من وجود معرف فريد (id) لكل InvoiceItem وفي حالة وجوده، يقوم بتحديث البيانات المرتبطة به. يجب على العميل (الجهة المستخدمة للواجهة) إرسال معرف فريد لكل InvoiceItem داخل الكائن items لتحقيق عملية التحديث بنجاح.

هذا النهج يمكن أن يساعدك في تجاوز التحديات التي واجهتك في عملية تحديث الكائنات المدمجة باستخدام Django Rest Framework.

المزيد من المعلومات

بالتأكيد، يبدو أن لديك مشكلة في تحديث كائن مدمج داخل كائن آخر في Django Rest Framework. لفهم السياق بشكل أفضل، يجب أن نلقي نظرة عن كثب على الشيفرة التي قدمتها ونتناول بعض النقاط الهامة.

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

قمت بتحديد المشكلة بشكل واضح في دالة update بالنسبة لك. في الواقع، عند تحديث Invoice, يجب عليك أولاً تحديث الحقول الأساسية ومن ثم التفاعل مع InvoiceItem. ولتحديد الكائن الصحيح، يجب عليك إضافة معرف فريد لكل InvoiceItem.

لحل هذا، يمكنك تحديث دالة update في InvoiceSerializer كما يلي:

python
def update(self, instance, validated_data): instance.nr = validated_data.get('nr', instance.nr) instance.title = validated_data.get('title', instance.title) instance.save() items_data = validated_data.get('items', []) existing_items = {item.id: item for item in instance.items.all()} for item_data in items_data: item_id = item_data.get('id') # تأكد من إرجاع 'id' في السيريالايزر if item_id: inv_item = existing_items.get(item_id) if inv_item: inv_item.name = item_data.get('name', inv_item.name) inv_item.price = item_data.get('price', inv_item.price) inv_item.save() else: # إذا لم يكن هناك 'id' فهو عملية إضافة جديدة InvoiceItem.objects.create(invoice=instance, **item_data) return instance

هذا يستخدم قاموس existing_items لتخزين الكائنات الموجودة بالفعل وتحديد الكائن الصحيح باستخدام المعرف (id). وعند تحديث، يتم فقط تحديث الكائنات التي تحتوي على id، وفي حالة الإضافة الجديدة، يتم إنشاء InvoiceItem جديد.

بهذا ينبغي أن يكون لديك الآن دالة update تعمل بشكل صحيح لتحديث الكائنات المتداخلة في Django Rest Framework.

زر الذهاب إلى الأعلى