متد های QuerySets در جنگو جنگو
03 Khordad 1402
0 نظر
11 : 6
متد های QuerySets در جنگو

در این مقاله لیستی از QuerySets هایی که اغلب مقداری برنمیگردانند را توصیح می دهیم.

1-latest() :

بر اساس فیلد(های) داده شده، آخرین شی را در جدول پایگاه داده برگردانید.

2-first():
اولین شی مطابق با QuerySet را برگردانید

3-count():
تعداد اشیاء موجود در QuerySet را می شمارد. می توان از آن برای شمارش تمام اشیاء در جدول پایگاه داده استفاده کرد

4-in_bulk()
لیستی از  id ها را می گیرد و یک دیکشنری که هر id را به نمونه ای از شی نگاشت می کند، برمی گرداند. اگر لیستی را به in_bulk() ارسال نکنید، همه اشیا برگردانده می شوند

5-aggregate()
یک فرهنگ لغت از مجموع مقادیر محاسبه شده روی QuerySet را برمی گرداند. برای محاسیه میانگین قیمت محصولات سایت و از این ثبیل کاربرد دارد.

6-exists()

اگر QuerySet برگشتی حاوی یک یا چند شی باشد True و اگر QuerySet خالی باشد False را برمی‌گرداند.

7-earliest()

بر اساس فیلد(های) داده شده، اولین شی در جدول پایگاه داده را برگردانید.

8-iterator()

QuerySet را ارزیابی کنید و یک تکرار کننده روی نتایج برگردانید. می تواند پرفرمنس را برای جستجو هایی که تعداد زیادی اشیاء را برمی گرداند بهبود بخشد.

9-explain()

توضیحی بصورت string  از طرح اجرای QuerySet را برمی گرداند. برای تجزیه و تحلیل عملکرد جستجو استفاده می شود.

10-bulk_create()

برای صرفه جویی در ایجاد چندین رکورد از این متد استفاده می کنیم، فقط کافیست لیستی از ابجکت های مورد نظر را به آن بدهیم.

11-bulk_update()

رکورد های مطابق با فیلد جستجو را با لیستی از مواردی بروزرسانی که ایجاد کرده ایم بروز می کند.

12-create()

روش میانبری برای ایجاد و ذخیره یک شی در یک مرحله.

14-get_or_create()

سعی خواهد کرد یک رکوردی مطابق با فیلدهای جستجو را برگرداند. اگر رکوردی وجود نداشته باشد، یک رکورد ایجاد می کند. مقدار بازگشتی یک تاپل حاوی شی ایجاد شده یا بازیابی شده و یک مقدار بولی است که اگر رکورد جدیدی ایجاد شود مقدادرش True خواهد بود

15-get()

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

16-update()

فیلد مورد نظر را بروزرسانی می کند.

17-as_manager()

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

18-update_or_create()

برای استفاده از این متد لازم است فیلد خاصی از ایتم مورد نظر را ارسال کنید مثلا ایمیل کاربر رو و با استفاده از اتربیوت defaults و بصورت دیکشنری مورد یا مواردی که قرار است بروز رسانی شودم را ارسال میکنید.

ToDoModel.objects.update_or_create(title='first', defaults={'description':'Complet First Job'})

19-last()

آخرین شی مطابق با QuerySet را برگردانید.

در این مقاله میخوایم 9 تا از متد هایی رو بررسی کنیم که کارایی زیاد در کوئری زدن به دیتا بیس دارن.

 

20-exclude()

وقتی بخواید بگید اگر این فیلد تو نتایج بود اون نتیجه رو از نتایج حذف کن دو راه دارید اولیش استفاده از ~Q() در کوئری که مثال شماره یک هست و دومی استفاده از exclude که مثال شماره دوم ماست.

1- Bool.objects.filter(~Q(title='django'))

2-Book.objects.exclude(title='django')

 

 

21-annotate()

22-order_by()

23-reverse()

24-distinct()

25-datetimes()

26-all()

27-none()

28-dates()

29-values()

30-values_list()

31-difference()

32-intersection()

33-union()

34-select_related()

35-using()

36-raw()

37-only()

نکته سعی کنید از این متد بعنوان آخرین متد در کوئری استفاده کنید.

با این میتونید انتخاب کنید که کدوم فیلد برگرده مثال only('name')  در این صورت فقط فیلد name برمیگرده.

38-prefetch_related() 

احتمال داره تو پروژه های خودتون متوجه کندی برنامه یا استفاده بیش از حد از منابع سرور شده باشید. اینجاست که prefetch_related میتونه یکی از راه حل ها باشه، چجوری؟ میگم براتون

فکر کنید سه مدل زیر رو دارید

class Country(model.Model):
    title= model.TextField()



class Writer(model.Model):
    countries = models.ManyToManyField(Country, related_name="countries")



class Book (model.Model):
    writers = models.ManyToManyField(Writer, related_name="writers")


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

و تو مدل Book میخواید حلقه بزنید روی نویسنده ها و بعدشم حلقه روی کشور ها.

 

به این حالت میگن NM+N+1 چون تو حلقه اول که روی کتاب ها زده میشه یک حلقه هم روی نویسنده ها میخوره و داخل اون هم یک حلقه روی کشور ها یعنی به اضای هر مقاله دو بار حلقه زده میشه. یعین اگه 10 تا مقاله و ده تا نویسنده و ده تا کشور داشته باشیم کافیه تا پرفرمنس پروژه (عملکرد) به شدت کاهش پیدا کنه پس بجای اینکه تو حلقه کوئری بزنیم با استفاده از متد prefetch_related (این متد یک کوئری JOIN (اتصال) ایجاد میکنه)    یک بار کوئری میزنه و چند تا تیبل رو استخراج میکنه اینجوری لازم نیست تو هر حلقه اطلاعات از دیتابیس استخراج بشه .

مثال

books = Book.objects.filter().prefetch_related('writers', 'writers__countries')

در این مثال با prefetch_related و به کمک related_name ها نویسنده ها و کشور های نویسنده ها رو هم تو یک بار اتصال به دیتابیس استخراج کردیم حالا با حلقه روی books میتونیم اطلاعات نویسندگان و کشورهای کتاب رو بدون اتصال دوباره به دیتابیس داشته باشیم.

 

39-select_for_update()

40-defer()

نکته سعی کنید از این متد بعنوان آخرین متد در کوئری استفاده کنید.

با این متد میتونید تعیین کنید کدوم فیلد یا فیلد ها بر نگردن مثال defer('name') در اینصورت فیلد name از خروجی حذف میشه.

چند قدم در چند راه

ابتدا وارد شوید یا ثبت نام کنید!

برای ثبت نظر، نقد ابتدا باید وارد شوید یا ثبت نام کنید.
سبد خرید