在Django Admin中基于自定义可调用列表显示进行排序
我的列表显示中有一个自定义的可调用项。我希望能够按它排序,但它不对应于单个字段,所以我不能单独使用admin\u order\u字段 如果选择queryset作为字段,我希望能够改变queryset的顺序以反映这一点。但是,看起来ChangeList视图在通过模型管理员的get_ordering调用运行它之后调用get_ordering,然后以a.b.c.etc.y.z格式循环给定的排序字段,其中a、b、c等都是与显示列表中的一个或多个字段相对应的整数 在本例中,我有一个订单页面,其中客户可以是公司/组织或个人。我希望能够对其进行排序,以便首先列出人员的所有顺序,然后是组织,并按字母顺序排列 让我们以此模型管理员设置为例:在Django Admin中基于自定义可调用列表显示进行排序,django,django-admin,Django,Django Admin,我的列表显示中有一个自定义的可调用项。我希望能够按它排序,但它不对应于单个字段,所以我不能单独使用admin\u order\u字段 如果选择queryset作为字段,我希望能够改变queryset的顺序以反映这一点。但是,看起来ChangeList视图在通过模型管理员的get_ordering调用运行它之后调用get_ordering,然后以a.b.c.etc.y.z格式循环给定的排序字段,其中a、b、c等都是与显示列表中的一个或多个字段相对应的整数 在本例中,我有一个订单页面,其中客户可以是
class OrderAdmin(models.ModelAdmin):
list_display = ('pk', 'date_ordered', 'customer')
def customer(self, obj):
return obj.organization or "%s %s" % (obj.first_name, obj.last_name)
目前,我无法进行排序,因为只有在可调用对象附加了admin_order_字段时,排序字段才可用:
def customer(self, obj):
return obj.organization or "%s %s" % (obj.first_name, obj.last_name)
customer.admin_order_field = 'customer'
问题是,理想情况下,我希望能够截取默认代码并说,如果其中一个字段是“customer”,则从列表中删除该字段,并使用[organization,last_name,first_name]对其进行排序。但据我所知,没有办法做到这一点
我怀疑extraselect={'customer':…}会起作用,但我使用的是django pyodbc,因为这是一个SQL Server数据库,生成的SQL根本不起作用并抛出错误:
SELECT *
FROM (SELECT
( COALESCE(organization, firstname + ' ' + lastname) ) AS [customer],
...,
( Row_number()
OVER (
ORDER BY [customer] ASC, [orders].[date_created] DESC,
[orders].[order_id] ASC
) ) AS
[rn]
FROM [orders]) AS X
WHERE X.rn BETWEEN 1 AND 100
错误是:
列名“customer”无效
除了重写django pyodbc之外,使用.extra不是一个解决方案
所以我想知道我是否还能做些什么,或者我是否必须放弃使用客户名称作为排序字段,并用单独的组织、姓氏和名字列替换它。请注意,admin\u order\u字段是SQL结果集中的字段。所以,您需要做的是在admin中覆盖get_queryset,这样您就有了一个用于排序的字段 您可能还需要Q和F函数。我不知道他们是否在pyodbc工作 现在,这个customer字段应该只用于排序。可通过obj.customer访问
然后,您需要一个函数,它也可以被称为customer,在该字段上进行排序。在其中,您可以使用COALESCE执行您想要执行的逻辑。是的,正如我在问题中提到的,不幸的是,仅在get\u queryset中使用.extra是不起作用的。据我所知,这个问题从来没有解决过。我设想为ModelAdmin类创建一个包装器,允许admin_order_字段成为一个iterable,而一个字段名也可以做到这一点。