gpt4 book ai didi

python - django admin 为计算字段启用排序

转载 作者:太空狗 更新时间:2023-10-29 21:21:48 26 4
gpt4 key购买 nike

我的数据库表和模型(模型名称:订单)中有以下两个字段:

id, branch_id, product_id, cost, quantity, status, ordered_at

我的 OrderModelAdmin 中有以下代码:

list_display = (
'order_number',
'branch',
'product',
'cost',
'quantity',
'calculated_total',
'status',
'ordered_at',
)

def calculated_total(self, obj):
return obj.cost * obj.quantity
calculated_total.short_description = _('Total')

现在,我想为该字段启用排序。实际上,我需要做的就是在我的 SELECT 语句中添加一列:

 SELECT (t.cost * t.quantity) as TOTAL
ORDER BY TOTAL

有没有办法在 Django Admin 中附加 SQL 语句进行排序?

最佳答案

无法根据 calculated_total 方法的结果进行排序。

但是,您可以通过覆盖 get_queryset 来为您的模型管理员设置默认排序模型管理员的方法,以及 ordering by an expression计算相同的东西。

class OrderModelAdmin(admin.ModelAdmin):
...
def get_queryset(self, request):
qs = super(OrderModelAdmin, self).get_queryset(request)
qs = qs.order_by(F('cost')*F('quantity'))
return qs

类似的方法是用总计注释查询集,然后按该字段排序。假设成本是一个DecimalField,数量是一个IntegerField,您需要使用ExpressionWrapper来设置输出字段。请参阅 Using F() with annotations 上的文档了解更多信息。

我认为在list_display中直接使用total是不可能的。但是,您可以更改 calculated_total 方法以访问带注释的字段。我们设置 calculated_total.admin_order_field = 'total' 以便 Django 管理员允许您通过单击对该列进行排序。

from django.db.models import F, ExpressionWrapper, DecimalField

class OrderModelAdmin(admin.ModelAdmin):
list_display = ['name', 'number', 'price', 'calculated_total']

def calculated_total(self, obj):
return obj.total
calculated_total.admin_order_field = 'total'

def get_queryset(self, request):
qs = super(OrderModelAdmin, self).get_queryset(request)
qs = qs.annotate(total=ExpressionWrapper(F('cost')*F('quantity'), output_field=DecimalField())).order_by('total')
return qs

关于python - django admin 为计算字段启用排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42659741/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com