# 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依赖底层DB来执行排序?在这里,创建一个包含订单数量的聚合字段似乎有点矫枉过正.

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

推荐答案

我很喜欢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'

这样,您只需在管理界面内进行注释.并不是对您进行的每个查询都是如此.

Django相关问答推荐

POST_SAVE接缝有错误

从url参数过滤的Django日期范围返回空查询集

为什么 Django 在错误的目录中寻找模板?

反向 url django 管理员

获取 Django Rest API 的第一个和最后一个相关对象

Django 身份验证系统修改

使用 Django 一次更新多条记录

使用 args 和选项编写自定义管理命令 - 所需字段说明

django 管理员登录突然要求 csrf 令牌

InvalidBasesError:无法解析 [] 的基础

Django ModelForm 没有指定模型类

如何在终端中切换 Python 版本?

如何动态检索 Django 模型类?

settings.DATABASES 配置不正确使用 django 1.4 执行 syncdb 时出错

django过滤器超过几天?

Django:以 10 为底的 int() 的无效文字

django 应用基于条件的样式类

如何在 Django 中创建一个非空的 CharField?

Django:根据自定义函数过滤查询

如何检测 Heroku 的环境?