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

السؤال

نشر

أرغب في تحديث جدول في قاعدة البيانات باستخدام جانغو 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.

  • إعلانات

  • تابعنا على



×
×
  • أضف...