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

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

我需要让工作人员按照它排序.

如果整数代表某些DB字段的计数/平均值等,那么有一个解决方案可以实现,但对我来说并非如此.

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

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

最佳答案
排序是在数据库引擎上完成的(按照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)"})

这可能会奏效.虽然没经过测试.

转载注明原文:如何允许通过自定义list_display字段在Django管理员中进行排序,该字段没有DB字段也没有可注释的 - 代码日志