【问题标题】:Django annotation on field added with extra在字段上添加了额外的 Django 注释
【发布时间】:2011-08-27 02:31:02
【问题描述】:

我正在尝试找到一种方法来对添加在一起的模型上的两个字段进行注释。比如:

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'解析为字段” 我已经尝试过这里指出的解决方案:Using .aggregate() on a value introduced using .extra(select={...}) in a Django Query? 但是,仍然没有运气得到“无法将关键字 'total_amount' 解析到字段中”

除了在原始 sql 中执行查询作为传入的查询字符串之外的任何其他操作都可能具有已经对其执行的各种过滤器和排除,这使得该前景有点复杂。我还试图避免将字段添加到实际模型并在保存期间计算它的值,除非这是唯一的方法。

【问题讨论】:

  • 'total_heal' 在您的查询中未提及,希望您的意思是total_amount
  • 我最近也遇到了同样的问题。从前面的问题来看,这似乎以前可以工作——它是否有可能(通过设计或偶然)在更高版本中被删除?问题显然不在 SQL 子句中,而在 aggregate() 函数中,因为如果我直接调用 queryset.total_amount 属性,它会很好地工作。

标签: django annotations aggregation extra


【解决方案1】:

我认为最好通过用户注释来获得 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')

【讨论】:

    【解决方案2】:

    试试这样的:

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

    【讨论】:

      【解决方案3】:

      根据https://stackoverflow.com/a/4348728/122033 的回答(实际上在 cmets 中):“Django 当然将 fullName 作为别名传递,这不适用于 MySQL”——我的猜测与 SQLite 无关,我已经一直在使用。 :(

      【讨论】:

        猜你喜欢
        • 2011-07-04
        • 2018-01-24
        • 2015-06-19
        • 1970-01-01
        • 2019-12-30
        • 2023-01-13
        • 1970-01-01
        • 1970-01-01
        • 2018-01-19
        相关资源
        最近更新 更多