【问题标题】:Django admin list display optimize querysetDjango 管理列表显示优化查询集
【发布时间】:2015-03-09 13:28:49
【问题描述】:

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')) 作为管理员更改列表的全局变量...

【问题讨论】:

  • 当我不得不做行级聚合字段时,我有时会使用原始 sql。它要快得多,并且数据库通常会缓存它。您可以使用的另一种技术您可以使用的另一种技术是创建另一个包含总收入(可能还有其他聚合字段)的聚合模型,然后根据 PartnerIncome 信号更新该字段(删除旧收入并添加新收入)

标签: python django optimization admin django-queryset


【解决方案1】:

在你的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/

如果我没有真正理解您的模型和业务逻辑..这里以我自己的代码中的 sn-p 为例:

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'))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-09
    • 2013-02-22
    • 2018-11-08
    • 2019-07-21
    • 2012-10-11
    • 1970-01-01
    相关资源
    最近更新 更多