我的列表显示中有自定义调用。我希望能够按它排序,但它不对应单个字段,因此我不能单独使用admin_order_field
。
如果将其选为字段,我希望能够更改查询集的顺序以反映这一点。但是,看起来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_field
的情况下才能使用排序字段:
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"]
对其进行排序” 。但据我所知,没有办法做到这一点。
我怀疑extra(select={'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
不是解决方案。
所以我想知道我能做什么,或者我只是不得不放弃使用客户名作为排序字段,并将其替换为单独的组织,姓氏和名字列。
答案 0 :(得分:0)
请注意,admin_order_field是SQL结果集中的字段。所以,你需要做的是在admin中覆盖get_queryset,这样你就有了一个适合你排序的“字段”。
您可能还需要Q()和F()函数。我不知道他们是否在pyodbc工作。
现在,这个“客户”字段应该只是用于排序。它可以通过obj.customer访问。
然后你需要一个在该字段上排序的函数(也可以称为“customer”)。在其中你可以用COALESCE做你想要的逻辑。