Django 管理列表显示优化查询集
Django admin list display optimize queryset
在 User
模型中我有一个方法:
@cached_property
def income(self):
return PartnerIncome.objects.all().aggregate(Sum('income'))['income__sum']*self.share_of_profit
合作伙伴收入模型:
class PartnerIncome(models.Model):
title = models.CharField(max_length=255)
income = models.FloatField(default=0)
现在我想在管理面板的 list_display=('income', )
中显示 'inccome',但是每个对象都会对数据库进行额外的查询。我如何使 PartnerIncome.objects.all().aggregate(Sum('income'))
作为管理员更改列表的全局变量...
在 ModelAdmin
中重写 get_queryset
方法如何?
class UserAdmin(admin.ModelAdmin):
list_display = ('income', ...)
def income(self, obj):
return obj.income
def get_queryset(self, request):
queryset = super(UserAdmin, self).get_queryset(request)
# you logic here to `annotate`the queryset with income
return queryset
关于 aggregation
的文档:
https://docs.djangoproject.com/en/dev/topics/db/aggregation/
如果我没有真正理解您的模型和业务逻辑.. 下面是我自己的代码片段作为示例:
class AuthorAdmin(admin.ModelAdmin):
list_display = ('__str__', 'books_count',)
def books_count(self, obj):
return obj.books_count
def get_queryset(self, request):
return super(AuthorAdmin, self).get_queryset(
request).annotate(books_count=Count('books'))
在 User
模型中我有一个方法:
@cached_property
def income(self):
return PartnerIncome.objects.all().aggregate(Sum('income'))['income__sum']*self.share_of_profit
合作伙伴收入模型:
class PartnerIncome(models.Model):
title = models.CharField(max_length=255)
income = models.FloatField(default=0)
现在我想在管理面板的 list_display=('income', )
中显示 'inccome',但是每个对象都会对数据库进行额外的查询。我如何使 PartnerIncome.objects.all().aggregate(Sum('income'))
作为管理员更改列表的全局变量...
在 ModelAdmin
中重写 get_queryset
方法如何?
class UserAdmin(admin.ModelAdmin):
list_display = ('income', ...)
def income(self, obj):
return obj.income
def get_queryset(self, request):
queryset = super(UserAdmin, self).get_queryset(request)
# you logic here to `annotate`the queryset with income
return queryset
关于 aggregation
的文档:
https://docs.djangoproject.com/en/dev/topics/db/aggregation/
如果我没有真正理解您的模型和业务逻辑.. 下面是我自己的代码片段作为示例:
class AuthorAdmin(admin.ModelAdmin):
list_display = ('__str__', 'books_count',)
def books_count(self, obj):
return obj.books_count
def get_queryset(self, request):
return super(AuthorAdmin, self).get_queryset(
request).annotate(books_count=Count('books'))