【问题标题】:Django - aggregate and annotate for simple operationsDjango - 为简单操作聚合和注释
【发布时间】:2018-07-06 08:48:21
【问题描述】:

我在文档中看到聚合和注释函数可用于在查询中创建一个新列,所以如果我写如下内容:

my_object = ...objects.filter(something).annotate(extra_column=Avg(value))

内部查询将给出一个额外的列

, AVG(value) AS "extra_column" ...

现在,在我看来,它只能用于 count、avg、max 和 min 之类的函数...我可以做一些简单的 +/- 某个数字吗?

我正在尝试.annotate(extra_column=another_column+1).annotate(extra_column='another_column'+1),但它不起作用。

我做错了什么?抱歉这个愚蠢的问题。

【问题讨论】:

  • 究竟是什么不起作用?你得到什么错误?
  • 您的问题解决了吗?你能结束这个问题吗?

标签: python django


【解决方案1】:

您可以使用F() 表达式进行算术运算。 F()query expressions 的一部分。来自文档:

Django 支持加法、减法、乘法、除法, 模算术和查询表达式的幂运算符,使用 Python 常量、变量,甚至其他表达式。

一个代码示例是:

from django.db.models import F

my_object = Model.objects.annotate(extra_column=F('another_column') + 1)
my_object = Model.objects.annotate(extra_column=F('another_column') * F('yet_another_column'))

【讨论】:

    【解决方案2】:

    聚合函数确实返回整数,可以通过加法、减法等操作。

    以下示例适用于 Django 1.11.6

    from django.db.models import Count
    employees = Employee.objects.annotate(managers=Count('manager') + 10) # every employee has only a single manager.
    print employees[0].managers # prints out 11 
    

    【讨论】:

    • 是的,但是...我不需要计算任何东西。为什么急于收盘?哈哈。我周末不上班
    猜你喜欢
    • 1970-01-01
    • 2016-11-18
    • 2021-01-20
    • 2011-07-07
    • 2023-03-29
    • 1970-01-01
    • 2017-07-21
    • 2020-05-23
    • 2015-12-29
    相关资源
    最近更新 更多