如何允许在 Django 管理员中通过自定义 list_display 字段进行排序,该字段没有 DB 字段,也没有可注释

Posted

技术标签:

【中文标题】如何允许在 Django 管理员中通过自定义 list_display 字段进行排序,该字段没有 DB 字段,也没有可注释【英文标题】:How to allow sorting in the Django admin by a custom list_display field, which doesn't have a DB field nor annotatable 【发布时间】:2011-02-08 12:15:31 【问题描述】:

我有一个自定义 list_display 字段,它负责我的一个管理页面中的一列整数。

我需要让工作人员根据它进行排序。

如果整数表示某个 DB 字段的计数/平均值/等,有一个解决方案来解决这个问题,而我的情况并非如此。

[该案例的解决方案在这里:Django admin: how to sort by one of the custom list_display fields that has no database field ]

任何想法如何在不实际创建和维护值的数据库字段的情况下实现这种排序?

【问题讨论】:

***.com/a/3351431/17498 【参考方案1】:

排序是在数据库引擎中完成的(在 order by 子句中),所以我认为除非您在模型中实现一个字段,否则您将无法实现您想要的。此时计算状态不可排序(至少在管理界面中不可排序,如果您使用自己的界面,则可以使用extra)。

如果问题是过滤,您可以编写自定义 FilterSpec(似乎没有在任何地方记录,但 SO 有一个 good example)。

但恐怕要在管理员中进行排序,您唯一的选择是物化字段。

编辑:

嗯……

你可以试试。 It is possible(尽管我认为它没有正式记录在任何地方)来更改 ModelAdmin 使用的查询集。如果您的计算字段足够简单,可以嵌入到查询本身中,您可以执行以下操作:

class BlahAdmin(admin.ModelAdmin):
    ... Whatever definitions ...

    def queryset(self, request):
        return Blah.objects.extra(select='computed': "count(field_x)")

这可能有效。但它未经测试。

【讨论】:

如果你的对象是被代理的,你必须给代理元类添加一个排序:ordering=['computed',],否则它会因为某种原因使用'id'。

以上是关于如何允许在 Django 管理员中通过自定义 list_display 字段进行排序,该字段没有 DB 字段,也没有可注释的主要内容,如果未能解决你的问题,请参考以下文章

ERP中通过自定义单打开流程图

从 UINavigationController 中通过自定义转换关闭 UIViewController 时出现黑屏

Laravel 中通过自定义命令创建 service 服务层文件

Laravel 中通过自定义分页器分页方法实现伪静态分页链接以利于 SEO

管理员中的 Django 自定义列表视图

Django自定制插件之随机验证码