🎉 سال نو، مهارت نو، مشاوره رایگان نقشه راه برنامه نویسی (آفر ویژه ثبت نام قبل از افزایش قیمت 🔥)
۰ ثانیه
۰ دقیقه
۰ ساعت
۲ saeed fadaoddini
نحوه استفاده از select_related و prefetch_related
جامعه پایتون (وب) ایجاد شده در ۱۲ آذر ۱۴۰۱

همون طور که در این درس اشاره شد می‌بایست وقتی داریم از سمت یک به چند کوئری می‌زنیم از select_related استفاده کنیم و زمانی که از سمت چند به یک داریم کوئری می‌زنیم از prefetch_related استفاده کنیم

اما در موردی که اتفاقا مبحث درس هم هست زمانی که می‌خواهیم کوئری بین category و product رو در نظر بگیریم خوب واضحه که هر محصول یک دسته بندی داره و هر دسته بندی می‌تونه چندین محصول رو داخل خودش داشته باشه البته در این مثال همین پروژه (چون میشه حتی چند به چند هم در نظر گرفت) اما نکته اینجاست دقیقا وقتی می‌خواهیم کوئری بزنیم بطور مثال اگر category رو A در نظر بگیریم و product رو B

در اینجا ما داریم از سمت B به سمت A کوئری می‌زنیم و این یعنی داریم از سمت چند به یک کوئری می‌زنیم چرا در این درس برعکس اجرا شد و البته من هر دوتا رو تست کردم روی این مورد خاص و هر دو جواب داد !

درود سعید جان امیدوارم حالت خوب باشه .

توی این جلسه یه برداشت اشتباه کوچیک اتفاق افتاده (که منظور استاد مورد دیگه ای بوده که من ذکر میکنم)

اول اینکه select_related یک کوئری با یک جوین هستش که از سمت Many به one زده میشه به عبارتی برای OneToOneField , ForeignKey

که یک شی واحد رو انتخاب میکنه استفاده میکنیم مثلا

Variation.objects.select_related("resource").all()

مثلا توی این مورد از سمت انواع محصول به خود محصول داریم select_related میزنیم

Resource.objects.prefetch_related("variations")

اینجا هم برعکس که از prefetch استفاده شده ( که برای ManyToManyField یا reverse ForeignKey استفاده میشه ) prefetch_related

هم کاری مشابه select related انجام میده با این تفاوت که دوتا کوئری میزنه به دو table ما و اون دوتا رو با پایتون به هم جوین میزنه نه با sql

حالا اگ بخوای کوئریت هنوز بهینه‌تر بشه از Prefetch() توی prefetch_related() استفاده کن

لینک


موفق باشی?


Reza Mobaraki ۱۲ آذر ۱۴۰۱، ۱۵:۴۹

درود سعید عزیز وقتت بخیر

ممنون میشم اگه مسئله حل شده تایید رو بزنی که تاپیک بسته بشه

موفق باشی ?

بهترین پاسخ
Reza Mobaraki ۱۳ آذر ۱۴۰۱، ۱۱:۰۷