في برمجة تطبيقات الويب باستخدام Django Rest Framework، يعد تحدي تحديث الكائنات المدمجة داخل كائن رئيسي من التحديات الشائعة. في مشروعك، تقوم بإنشاء كائن Invoice
مع كائنات InvoiceItem
المرتبطة به. فيما يلي شرح مفصل لكيفية التعامل مع تحديث هذه الكائنات المدمجة في بيئة Django Rest Framework.
لتحديث الكائنات المدمجة، يجب عليك التفكير في التالي:
-
تحديث البيانات الرئيسية للكائن الرئيسي: يجب أولاً تحديث البيانات الرئيسية لكائن
Invoice
. -
تحديث الكائنات المدمجة: بعد تحديث الكائن الرئيسي، يجب عليك الآن التفاعل مع الكائنات المدمجة، أي
InvoiceItem
. يمكن القيام بذلك باسترجاع الكائنات المدمجة من البيانات المحدثة وتحديثها بشكل فردي.
قم بتحديث دالة update
في InvoiceSerializer
كما يلي:
pythondef 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
كما يلي:
pythondef 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.