Jor*_*ter 5 django django-admin
我的列表显示中有自定义可调用.我希望能够按它排序,但它不对应于单个字段,所以我不能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)
Run Code Online (Sandbox Code Playgroud)
目前,我无法排序,因为只有在callable admin_order_field附加了一个排序字段时才可用:
def customer(self, obj):
return obj.organization or "%s %s" % (obj.first_name, obj.last_name)
customer.admin_order_field = 'customer'
Run Code Online (Sandbox Code Playgroud)
问题是,理想情况下,我希望能够拦截默认代码并说"如果其中一个字段是'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
Run Code Online (Sandbox Code Playgroud)
错误是:
列名称"customer"无效.
没有重写django-pyodbc,使用.extra不是解决方案.
所以我想知道如果有什么我可以做的,或者如果我只是放弃对自身使用的客户名称作为排序字段,并配有独立的组织,姓氏和名字列替换它.
小智 0
请注意,admin_order_field 是 SQL 结果集中的字段。因此,您需要做的是覆盖管理中的 get_queryset,这样您就有一个适合您排序的“字段”。
您可能还需要 Q() 和 F() 函数。我不知道他们是否在 pyodbc 中工作。
现在,这个“客户”字段实际上应该只是用于排序。它可以通过 obj.customer 访问。
然后您需要一个在该字段上排序的函数(也可以称为“客户”)。在其中您可以执行您想要使用 COALESCE 执行的逻辑。
| 归档时间: |
|
| 查看次数: |
1751 次 |
| 最近记录: |