Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Django Admin中基于自定义可调用列表显示进行排序_Django_Django Admin - Fatal编程技术网

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

在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等都是与显示列表中的一个或多个字段相对应的整数 在本例中,我有一个订单页面,其中客户可以是

我的列表显示中有一个自定义的可调用项。我希望能够按它排序,但它不对应于单个字段,所以我不能单独使用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,而一个字段名也可以做到这一点。