tgoop.com/djangolearn_ir/807
Create:
Last Update:
Last Update:
بیایید به بهانه آپتومایز کردن کوئریهای #جنگو چندتا چیز جدید درباره ORM جنگو یاد بگیریم
شما همیشه وقتی چیزی رو نیاز دارید داخل جنگو همچین کوئری میزنید:
Record.objects.filter(id__in=[1,2,3,4])
خب این قرار آبجکتهایی که ایدی ۱ تا ۴ دارن بهمون بده. حالا شما میخوایید با اینا یکسری پردازش انجام بدید مثلا بیایید اسم همه رکوردها رو نشون کار برید یا به عبارتی:
for r in records:
print(record.name)
و کار شما اینجا تموم میشه و خوشحال میشید. اماااااااا شما یک عالمه پردازش بی جا انجام دادید و یک عالمه منابع الکی خرج کرید. بیایید ببینیم کوئری بالا وقتی sql میشه چه شکلی میشه:
SELECT id,
name,
created_at,
is_deleted
FROM records
WHERE id IN (1, 2, 3, 4);
این چیزی که داخل دیتابیس اجرا میشه. متوجه اش شدید؟
اگه نشدید باید بگم شما فقط به فیلد name نیاز داشتید اما تمام فیلدهای اون اون رکوردها رو گرفتید! هیچ وقت هم ازشون استفاده نکردید.
برای حل این مشکل جنگو دوتا راه حل داره:
1. values
2. values_list
با استفاده از این دو میتونید فقط فیلدهایی که میخوایید رو بگیرید. برای مثال:
Record.objects.filter(id__in=[1,2,3,4]).values('name')
و حالا کوئری که میسازید همچین چیزی خواهد شد:
SELECT name
FROM records
WHERE id IN (1, 2, 3, 4);
و همینطور که میبینید حالا فقط اون فیلدی رو گرفتید که لازمش دارید.
تفاوت بین values و valuse_list تنها در دیتا استراکچر خروجی که به شما میده و داخل کوئری نهایی هردو مثل هم عمل میکنن. برای درک بیشتر:
>>> Record.objects.filter(is_deleted=False).values('id', 'name')
<QuerySet [{'id': 1, 'name': 'First record'}, {'id': 2, 'name': 'Second Record'}, {'id': 3, 'name': 'Third Record'}]>
>>> Record.objects.filter(is_deleted=False).values_list('id', 'name')
<QuerySet [(1, 'First record'), (2, 'Second Record'), (3, 'Third Record')]>
بله یکی دیکشنری و دومی تاپل :) همچنین اگه فقط فقط یک فیلد میخوایید مثلا name میتونید از flat=True هم استفاده کنید برای بهتر شدن دیتا خروجی:
>>> Record.objects.filter(is_deleted=False).values_list('name',flat=True)
<QuerySet ['First record', 'Second Record', 'Third Record']>
@TorhamDevCH
BY جنگولرن
Share with your friend now:
tgoop.com/djangolearn_ir/807