一尘不染

Django Admin:如何按没有数据库字段的自定义list_display字段之一进行排序

django

admin.py

class CustomerAdmin(admin.ModelAdmin):
list_display = (‘foo’, ‘number_of_orders’)

models.py

class Order(models.Model):
bar = models.CharField[…]
customer = models.ForeignKey(Customer)

class Customer(models.Model):
foo = models.CharField[…]
def number_of_orders(self):
return u’%s’ % Order.objects.filter(customer=self).count()
如何根据客户对客户进行分类number_of_orders?

admin_order_field属性不能在这里使用,因为它需要一个数据库字段进行排序。由于Django依赖底层数据库执行排序,这有可能吗?创建一个包含订单数量的汇总字段似乎在这里是过大的。

有趣的是:如果您在浏览器中手动更改url以在此列上进行排序-它将按预期工作!


阅读 648

收藏
2020-03-26

共1个答案

一尘不染

我喜欢Greg解决此问题的方法,但我想指出,你可以直接在管理员中执行相同的操作:

from django.db import models

class CustomerAdmin(admin.ModelAdmin):
    list_display = ('number_of_orders',)

    def get_queryset(self, request):
    # def queryset(self, request): # For Django <1.6
        qs = super(CustomerAdmin, self).get_queryset(request)
        # qs = super(CustomerAdmin, self).queryset(request) # For Django <1.6
        qs = qs.annotate(models.Count('order'))
        return qs

    def number_of_orders(self, obj):
        return obj.order__count
    number_of_orders.admin_order_field = 'order__count'

这样,你只需在管理界面内进行注释。并非与你执行的每个查询有关。

2020-03-26