【问题标题】:Why does Django Queryset say: TypeError: Complex aggregates require an alias?为什么 Django Queryset 说:TypeError:复杂聚合需要别名?
【发布时间】:2015-11-25 03:59:48
【问题描述】:

我有一个 Django 类如下:

class MyModel(models.Model):
    my_int = models.IntegerField(null=True, blank=True,)
    created_ts = models.DateTimeField(default=datetime.utcnow, editable=False)

当我运行以下查询集时,出现错误:

>>> from django.db.models import Max, F, Func
>>> MyModel.objects.all().aggregate(Max(Func(F('created_ts'), function='UNIX_TIMESTAMP')))
Traceback (most recent call last):
  File "<console>", line 1, in <module>
  File "MyVirtualEnv/lib/python2.7/site-packages/django/db/models/query.py", line 297, in aggregate
    raise TypeError("Complex aggregates require an alias")
TypeError: Complex aggregates require an alias

如何调整我的查询集以免出现此错误? 我想用最新的 created_ts 找到 MyModel 的实例。而我想使用UNIX_TIMESTAMP函数来获取它。

【问题讨论】:

    标签: django django-models max unix-timestamp


    【解决方案1】:

    我没有运行相同的 Django 版本,但我认为这会起作用:

    MyModel.objects.all().aggregate(latest=Max(Func(F('created_ts'), function='UNIX_TIMESTAMP')))
    

    注意其中的latest 关键字参数。这是关键(我想,我无法再次测试)。

    【讨论】:

      【解决方案2】:

      From the django docs:

      aggregate() 是 QuerySet 的终止子句,当被调用时, 返回名称-值对的字典

      它会在许多通用情况下自动提供此值,例如

      Sum('items') -> sum_items
      

      对于您的查询,它无法创建默认别名,因此您必须提供一个。这样查询就可以为生成的值返回一个命名结果。你所要做的就是给你的聚合一个有意义的命名别名,一切都应该正常工作:

      MyModel.objects.all().aggregate(max_created=Max(Func(F('created_ts'), function='UNIX_TIMESTAMP')))
      

      【讨论】:

        【解决方案3】:

        只需要为结果变量设置名称:

        在下面的代码中查看item

        result = MyModel.objects.all().aggregate(item=Max(Func(F('created_ts'), function='UNIX_TIMESTAMP')))
        result.get('item')
        

        【讨论】:

          猜你喜欢
          • 2021-11-23
          • 2016-09-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-02-17
          • 2017-09-23
          • 2017-10-08
          • 1970-01-01
          相关资源
          最近更新 更多