【发布时间】:2020-06-03 09:10:31
【问题描述】:
我对自定义 list_display 字段“余额”的 SQL 查询优化有疑问。
用于获取对每一行执行的帐户余额查询。有什么方法可以避免它并使计数查询固定。
我尝试使用prefetch_related,但这没有任何效果。
class UserAdmin(admin.ModelAdmin):
form = UserAdminForm
fields = [
'username',
'password',
'last_name',
'first_name',
'middle_name',
'groups'
]
list_display = [
'username_',
'person_name',
'balance',
]
def balance(self, obj):
balance = obj.person.customer.customeraccount_set.first().account.balance
return balance
balance.allow_tags = True
balance.short_description = 'Balance'
def get_queryset(self, request):
qs = super().get_queryset(request).prefetch_related(
Prefetch('person__customer__customeraccount_set__account', queryset=CustomerAccount.objects.all()),
'person', 'person__customer', 'person__customer__customeraccount_set',
).filter(groups__name='водитель')
ordering = self.get_ordering(request)
if ordering:
qs = qs.order_by(*ordering)
return qs
【问题讨论】:
-
您没有预取客户帐户模型。您需要预取它以避免 N+1 查询。
-
现在我预取了客户帐户模型,但这不起作用。请查看更新的代码。
标签: django django-models django-admin django-orm sql-optimization