python - 在 Django ORM 中, "values"和 "annotate"无法分组

标签 python django python-3.x django-orm

我有一个这样的表:

enter image description here

现在我想总结一下每次约会的用餐情况。我已经写了下面的代码。但它并没有像我想要的那样工作。

型号:

class Meal(models.Model):
    user = models.ForeignKey(settings.AUTH_USER_MODEL, default=1)
    date_of_meal = models.DateField()
    morning_meal = models.SmallIntegerField(default=0)
    mid_day_meal = models.SmallIntegerField(default=0)
    night_meal = models.SmallIntegerField(default=0)
    updated = models.DateTimeField(auto_now=True, auto_now_add=False)
    timestamp = models.DateTimeField(auto_now=False, auto_now_add=True)

    class Meta:
        ordering = ['-updated', '-timestamp']

    def __str__(self):
        return str(self.date_of_meal)

代码:

meals_list = Meal.objects.values('date_of_meal').annotate(mm=Sum('morning_meal'), mdm=Sum('mid_day_meal'), nm=Sum('night_meal'))

输出:

<QuerySet [{'mdm': 0, 'mm': 1, 'date_of_meal': datetime.date(2017, 3, 
23), 'nm':
 1}, {'mdm': 1, 'mm': 1, 'date_of_meal': datetime.date(2017, 3, 23), 'nm': 0}, {
'mdm': 1, 'mm': 0, 'date_of_meal': datetime.date(2017, 3, 22), 'nm': 1}, {'mdm':
 0, 'mm': 1, 'date_of_meal': datetime.date(2017, 3, 22), 'nm': 1}, {'mdm': 1, 'm
m': 1, 'date_of_meal': datetime.date(2017, 3, 21), 'nm': 1}, {'mdm': 1, 'mm': 1,
 'date_of_meal': datetime.date(2017, 3, 21), 'nm': 1}, {'mdm': 1, 'mm': 1, 'date
_of_meal': datetime.date(2017, 3, 20), 'nm': 1}, {'mdm': 1, 'mm': 1, 'date_of_me
al': datetime.date(2017, 3, 20), 'nm': 1}, {'mdm': 1, 'mm': 0, 'date_of_meal': d
atetime.date(2017, 3, 19), 'nm': 0}, {'mdm': 0, 'mm': 0, 'date_of_meal': datetim
e.date(2017, 3, 19), 'nm': 1}]>

它多次重复相同的日期。

但我想要这样的:

<QuerySet [{'mdm': 1, 'mm': 2, 'date_of_meal': datetime.date(2017, 3, 23), 'nm':
 1}, 
{'mdm': 1, 'mm': 1, 'date_of_meal': datetime.date(2017, 3, 22), 'nm': 2},

............
............
so on........
]>

如何获得预期的输出?

最佳答案

(答案隐藏在评论中,所以我把它变成了一个正确的答案。我花了几个小时来解决同样的问题。)

关键问题是 Django 会自动将您排序的字段添加到 values()。因此,在您的情况下,您认为您正在执行 .values('date_of_meal')。但是由于模型上的 ordering = ['-updated', '-timestamp'],django 将其转换为 `.values('date_of_meal', 'updated', 'timestamp') 。 ..

有了这样一个意想不到的 .values(),您当然不会得到您期望的 group_by 行为。

解决方案是通过添加空的 .order_by() 或根据您的情况添加 .order_by('date_of_meal') 来“重置”默认顺序。

参见 the django documentation

关于python - 在 Django ORM 中, "values"和 "annotate"无法分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43132917/

相关文章:

python - Python中使用while true的位数

python - 访问 geoseries 中几何图形中的行

ajax - Django & Ajax - 没有返回语句的 View

django - 创建模型时使用外键自动创建模型 - Django

django - 将自定义表单参数传递给表单集

python - 为 python version=x 启动 ipython qtconsole/notebook 的正确语法是什么

python - 为什么 "if not a := say_empty()"会引发 SyntaxError?

python - 如何记录 f2py 的 fortran 函数?

python - 检查python中两个字符串之间的交集

python - 如何在 Python 3.x 中验证日期?