1 回答

TA貢獻1813條經驗 獲得超2個贊
正如您的代碼為每個EmailList實例生成 6 個查詢一樣。對于 100 個實例,至少 600 個查詢會減慢速度。
您可以使用SubQuery()表達式和進行優(yōu)化.values()。
from django.db.models import Count, OuterRef, Subquery
data = (
EmailList.objects
.annotate(
past_contacts=Count(Subquery(
Contact.objects.filter(
email_list=OuterRef('pk'),
status='active',
create_date__lt=start_date
).values('id')
)),
past_unsubscribes=...,
past_deleted=...,
new_contacts=...,
new_unsubscribes=...,
new_deleted=...,
)
.values(
'past_contacts', 'past_unsubscribes',
'past_deleted', 'new_contacts',
'new_unsubscribes', 'new_deleted',
)
)
更新:對于舊版本的 Django,您的子查詢可能需要如下所示
customers = (
Customer.objects
.annotate(
template_count=Subquery(
CustomerTemplate.objects
.filter(customer=OuterRef('pk'))
.values('customer')
.annotate(count=Count('*')).values('count')
)
).values('name', 'template_count')
)
添加回答
舉報