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

تعديل كائنات متعددة من نموذج model في جانغو Django

Amer Abdallah

السؤال

أرغب في تحديث جدول في قاعدة البيانات باستخدام جانغو Django، بحيث يتم تنفيذ جملة SQL التالية في النهاية:

update tbl_name set name = 'new name' where name = 'old name'

حاولت أن أقوم بالكود التالي، لكن أعتقد أنه ليس من العملي أن أقوم بالمرور على كل كائن في قاعدة البيانات وأغير قيمة name ثم أحفظ الكائن الجديد:

list = ModelClass.objects.filter(name = 'bar')
for obj in list:
    obj.name = 'foo'
    obj.save()

هل هناك طريقة أكثر فعالية وسرعة من الكود السابق؟

رابط هذا التعليق
شارك على الشبكات الإجتماعية

Recommended Posts

  • 1

بداية من الإصدار 2.2 من جانغو Django أصبح بإمكانك تعديل مجموعة من الكائنات دفة واحدة من خلال التابع bulk_update، كالتالي:

>>> objs = [
...    Entry.objects.create(name='old name 1'),
...    Entry.objects.create(name='old name 2'),
... ]
>>> objs[0].name = 'new name 1'
>>> objs[1].name = 'new name 2'
>>> Entry.objects.bulk_update(objs, ['name'])

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

أما بالنسبة للإصدارات الأقدم (تعمل الطريقة مع كل إصدارات جانغو Django) فيمكنك أن تقوم بعمل التالي:

Entry.objects.filter(name='old name').update(name="new name")

يعيد الكود السابق عدد الكائنات التي تم تحديثها في قاعدة البيانات كرقم صحيح Integer

ملاحظة: إن كان لديك كود في التابع save فلن يتم تنفيذه، حيث أن التابع save لا يتم إستدعائه من البداية.

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0

يمكنك استخدام bulk_update بسهولة لفعل ذلك.

في البداية عليك تنزيلها كالتالي:
 

pip install django-bulk-update

بعد ذلك يمكنك استخدامها بسهوله  كما المثال التالي:

from bulk_update.helper import bulk_update

random_names = ['Walter', 'The Dude', 'Donny', 'Jesus']
people = Person.objects.all()

for person in people:
    r = random.randrange(4)
    person.name = random_names[r]

bulk_update(people)  # تحديث كل الأعمدة من قاعدة البيانات

وفي حالتك يمكنك تنفيذها في سطر واحد كالتالي:

ModelClass.objects.filter(name='bar').update(name="foo")

 

رابط هذا التعليق
شارك على الشبكات الإجتماعية

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

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

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

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   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.

  • إعلانات

  • تابعنا على



×
×
  • أضف...