gpt4 book ai didi

django - 基于列表显示中的自定义可调用项在 Django Admin 中进行排序

转载 作者:行者123 更新时间:2023-12-03 17:54:44 25 4
gpt4 key购买 nike

我的列表显示中有一个自定义的可调用对象。我希望能够通过它进行排序,但它不对应单个字段,所以我无法使用 admin_order_field 在其自己的。

如果它被选为一个字段,我希望能够改变查询集的顺序以反射(reflect)这一点。但是,它看起来像 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'

问题是,理想情况下,我希望能够拦截默认代码并说,“如果其中一个字段是‘客户’,请从列表中删除该字段,然后使用 ["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

错误是:

Invalid column name 'customer'.



缺少重写 django-pyodbc,使用 .extra不是解决方案。

所以我想知道是否还有什么我可以做的,或者我是否只需要放弃使用客户名称作为排序字段,而将其替换为单独的组织、姓氏和名字列。

最佳答案

请注意 admin_order_field 是 SQL 结果集中的一个字段。因此,您需要做的是覆盖 admin 中的 get_queryset 以便您拥有一个适合您的排序的“字段”。

https://docs.djangoproject.com/en/dev/ref/contrib/admin/#django.contrib.admin.ModelAdmin.get_queryset

您可能还需要 Q() 和 F() 函数。我不知道他们是否在 pyodbc 中工作。

现在,这个“客户”字段应该只用于排序。它可以通过 obj.customer 访问。

然后您需要一个在该字段上排序的函数(也可以称为“客户”)。并在其中执行您想要使用 COALESCE 执行的逻辑。

关于django - 基于列表显示中的自定义可调用项在 Django Admin 中进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13146346/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com