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

How to allow sorting in the Django admin by a custom list_display field, which doesn't have a DB field nor annotatable

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

我需要允许员工根据它进行分类。

如果整数表示某个db字段的count/average/etc,这是一个如何实现的解决方案,我不这么认为。

[该案例的解决方案如下:django admin:如何按没有数据库字段的自定义列表显示字段之一排序]

我有什么想法可以在不创建和维护值的db字段的情况下实现这种排序?


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

如果问题是过滤,您可以编写一个自定义的filterspec(它似乎没有在任何地方记录,但是有一个很好的例子)。

但对于管理中的排序,恐怕您唯一的选择是物化字段。

编辑:

六羟甲基三聚氰胺六甲醚。。。

你可以试试看。有可能(尽管我认为在任何地方都没有正式的文档记录)更改modeladmin使用的查询集。如果计算字段足够简单,可以嵌入查询本身,则可以执行以下操作:

1
2
3
4
5
class BlahAdmin(admin.ModelAdmin):
    ... Whatever definitions ...

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

这可能有效。但它还没有经过测试。