6

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

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

错误是:

列名“客户”无效。

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

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

4

1 回答 1

0

请注意 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 执行您想要执行的逻辑。

于 2014-02-28T18:10:34.253 回答