اذهب إلى المحتوى

السؤال

نشر

أحاول أن أقوم بتمرير عدد من الكائنات إلى علاقة many-to-many، وحسب توثيق جانغو Django ، يجب أن أكون قادرًا على تمرير كائنات متعددة في وقت واحد لإضافتها إلى علاقة many-to-many على النحو التالي:

Users.m2mfield.add([obj1, obj2, obj3])

ولكني أحصل على الخطأ التالي:

TypeError: unhashable type: 'list'

عندما أحاول تمرير عدد من queryset في قائمة list. ويبدو أن تمرير كائن من نوع Queryset أو ValuesListQueryset يفشل أيضًا. هل هناك طريقة أفضل من استخدام حلقة for وتمرير كل كائن على حدى؟

Recommended Posts

  • 1
نشر

التابع add يقبل إدخال أكثر من كائن في نفس الوقت بالشكل التالي:

Users.m2mfield.add(obj1, obj2, obj3)

أي أنه يجب أن تمرر الكائنات مباشرة إلى التابع add وليس تمرير قائمة من الكائنات.

إن كانت لديك قائمة من الكائنات وتريد تمرير محتوياتها فيمكنك أن تستخدم علامة * قبل القائمة على النحو التالي:

Users.m2mfield.add(*[obj1, obj2, obj3])

ولاحظ أن بهذه الطريقة لا يقوم جانغو Django يإستدعاء التابع save لكل كائن، ولكنه يستخدم التابع bulk_create، وبالتالي يتم تنفيذ جملة SQL واحدة فقط.

وفي حالة أردت أن تقوم بتحديث الكئانات الموجودة بالفعل في قاعدة البيانات، فيمكنك أن تستعمل التابع set والذي يقوم بحذف كل الكائنات الموجودة في هذه العلاقة (many-to-many)، وينشيئهم من جديد، وتستخدم على النحو التالي:
 

Users.m2mfield.set([obj1, obj2, obj3])

لاحظ أن التابع set يقبل تمرير قائمة من الكائنات بشكل مباشر (أي بدون وضع علامة * قبل القائمة).

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...