繁体   English   中英

在Django ORM中,“值”和“注释”不适用于分组

[英]In Django ORM, “values” and “annotate” are not working to group by

我有这样一张桌子:

在此输入图像描述

现在我想总结每个日期的饭菜。 我写了下面的代码。 但它并不像我想的那样有效。

模型:

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')来“重置”默认排序。

请参阅django文档

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM