توضیح querysetهای تنبل در جنگو

April 2020

تمامی querysetها در جنگو تنبل هستند یعنی تا زمانی که مجبور(evaluate) نباشند به دیتابیس متصل نشده و اطلاعات را نمیگیرند.

این تنبل بودن querysetها باعث مصرف بهینه منابع خواهد شد. شما میتوانید تمام روز را مشغول نوشتن queryset باشید اما queryset ها حتی یکبار هم به دیتابیس وصل نخواهند شد. به مثال زیر دقت کنید:

>> p1 = Person.objects.get(id=2)
>> p2 = Person.objects.filter(name='john')
>> cars = Car.objects.order_by('speed')
>> cars.filter(name='benz')

در هیچکدام از موارد فوق querysetها حتی یکبار هم به دیتابیس وصل نشده‌اند. این querysetها فقط در حافظه موقت برنامه شما قرار دارند و تا زمانی که این querysetها را  evaluate نکنید به دیتابیس متصل نخواهند شد.

برای evaluate کردن querysetها روش ها مختلفی وجود دارد.

iteration: اگر داخل یک queryset حلقه بزنید:

for p in Person.objects.all():
    print(p.name)

slicing: اگر querysetها را به روش list تکه کنید:

Person.objects.all()[:3]

repr(): اگر از متد repr استفاده کنید:

p1 = Person.objects.all()
repr(p1)

len(): اگر از متد len استفاده کنید:

p = Person.objects.all()
len(p)

list(): برای مجبور کردن یک queryset برای evaluate شدن میتوانید از متد list() استفاده کنید:

list(Person.objects.all())

bool(): اگر از شرط ها در کنار queryset استفاده کنید:

if Person.objects.filter(name='admin'):
    print('Hello admin...')

 

ارسال نظر

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