Django使用extra添加的字段进行注释

12

我正在尝试找到一种方法,可以对模型中两个字段相加的注释进行操作。例如:

total_done = qs.values(
    'ability__ability_name',
).extra(
    select={
        'total_amount': 'effective_value + overage',
    }
).annotate(
    total=Sum('total_amount'),
).values(
    'ability__ability_name', 'total_amount'
).order_by('-total_amount')
上面的方法不起作用,并出现错误“无法将关键字'total_amount'解析为字段”。 我已经尝试了这里所示的解决方案:在Django查询中使用.extra(select={...})引入的值上使用.aggregate(),但仍然没有成功,仍然会得到“无法将关键字'total_amount'解析为字段”的错误。 除了在原始SQL中执行查询,因为传递的查询字符串可能已经执行了各种过滤和排除操作,使得这个前景有点复杂之外,还有其他方法吗?我也试图避免将字段添加到实际模型中,并在保存期间计算其值,除非这是唯一的方法。

“total_heal”在您的查询中未提及,希望您是指“total_amount”? - Torsten Engelbrecht
我最近也遇到了同样的问题。从之前的问题来看,似乎这在以前是可以工作的 - 是否可能(出于设计或意外)在后续版本中删除了它?问题显然不在SQL子句中,而是在aggregate()函数中,因为如果我直接调用queryset.total_amount属性,它可以正常工作。 - Berislav Lopac
3个回答

2

我认为最好使用注解来获取total_amount的值:

total_done = qs.values(
'ability__ability_name',
).annotate(
    total_amount=F('effective_value') + F('overage')
    total=Sum('total_amount'),
).values(
    'ability__ability_name', 'total_amount'
).order_by('-total_amount')

1

可以尝试这样做:

total_done = qs.extra(select = {'total_amount': 'SUM(one_column + another_column)'}, )

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接