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

السؤال

نشر

أحاول أن أفهم الفرق بين select_related و prefetch_related، ووجدت في توثيق جانغو Django النص التالي:

اقتباس

select_related() "follows" foreign-key relationships, selecting additional related-object data when it executes its query.

prefetch_related() does a separate lookup for each relationship, and does the "joining" in Python.

ماذا يعني القيام بـ "joining" في بايثون؟ هل يمكن لشخص أن يوضح لي هذا الأمر؟

وحسب إعتقادي أننا نستعمل select_related في حالة وجود علاقة بـ foreign key، ونستخدم prefetch_related عندما يكون هناك علاقة many to many، هل هذا صحيح أم أن هناك إختلاف آخر؟

Recommended Posts

  • 1
نشر

يمكنك استخدام select_related عندما يكون الكائن الذي ستحدده كائن واحد، وبالتالي OneToOneField أو ForeignKey. ويمكنك استخدام prefetch_related عندما تحصل على "set" من الأشياء ، لذا ManyToManyFields كما ذكرت أو reverse ForeignKeys.والمثال التالي لتفهم أكثر المقصود ب reverse ForeignKeys:

class mymodel(models.Model):
    pass
class my2(models.Model):
    f = ForeignKey(mymodel)
# علاقة Forward ForeignKey
my2.objects.select_related('f').all()
# Reverse ForeignKey
mymodel.objects.prefetch_related('modelb_set').all()

الفرق هو أن select_related يقوم بضم SQL وبالتالي يحصل على النتائج مرة أخرى كجزء من الجدول من خادم SQL. من ناحية أخرى ، ينفذ prefetch_related استعلامًا آخر وبالتالي يقلل من الأعمدة الزائدة في الكائن الأصلي أي يكافئ mymodel في المثال التالي. يمكنك استخدام prefetch_related لأي شيء يمكنك استخدام select_related له. الاختلافات أو المفاضلات بينهما هي أنه يجب على prefetch_related إنشاء وإرسال قائمة بالمعرفات للاختيار مرة أخرى إلى الخادم، وقد يستغرق ذلك بعض الوقت. حيث أن Django يرسل قائمة ويطلب فيها تحديد بعض المعلومات. وفي هذه الحالة إذا كانت البيانات التي تم جلبها مسبقاً متناثرة، فقد يكون هذا أمراً جيداً، ولكن إذا كانت أقرب إلى one-to-one، فقد يؤدي ذلك إلى إهدار الكثير من الاتصالات. أيضاً هناك فائدة ل prefetch_related إضافية تتمثل في استخدام كائن واحد لتمثيل كل كائن في قاعدة البيانات. أما باستخدام select_related، سيتم إنشاء كائنات مكررة في Python لكل كائن "parent". وكما نعلم فإن الكائنات في Python تحجز حجم كبير من الذاكرة، وهذا أمر سلبي.

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

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

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

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

  • إعلانات

  • تابعنا على



×
×
  • أضف...