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

2024-04-18 23:34:56 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一张这样的桌子:

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)

代码:

^{pr2}$

输出:

<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........
]>

我怎样才能得到预期的产出?在


Tags: of代码defaultautodatetimedatemodelsnow
1条回答
网友
1楼 · 发布于 2024-04-18 23:34:56

(答案隐藏在评论里,所以我把它变成了一个恰当的答案。我花了几个小时也遇到了同样的问题。)

关键问题是Django自动将您排序的字段添加到values()。所以在你的例子中,你认为你在做.values('date_of_meal')。但是由于模型上的ordering = ['-updated', '-timestamp'],django将其转换为`.values('date_of_meat','updated','timestamp')。。。在

有了这样一个出人意料的.values()你当然不会通过你期望的行为来获得群体。在

解决方案是通过添加一个空的.order_by()或在您的例子中,.order_by('date_of_meal')来“重置”默认顺序。在

the django documentation

相关问题 更多 >