【发布时间】:2023-03-14 20:15:02
【问题描述】:
假设以下示例模型:
# models.py
class event(models.Model):
location = models.CharField(max_length=10)
type = models.CharField(max_length=10)
date = models.DateTimeField()
attendance = models.IntegerField()
我想使用 Django ORM 获取每个活动地点和类型组合的最新日期的出席人数。根据Django Aggregation documentation,我们可以通过在annotation 前面使用values 来实现类似的效果。
...原始结果根据 values() 子句中指定的字段的唯一组合进行分组。然后为每个唯一组提供注释;注释是在组的所有成员上计算的。
所以使用示例模型,我们可以这样写:
event.objects.values('location', 'type').annotate(latest_date=Max('date'))
确实按位置和类型对事件进行分组,但不返回 attendance 字段,这是所需的行为。
我尝试的另一种方法是使用 distinct 即:
event.objects.distinct('location', 'type').annotate(latest_date=Max('date'))
但我得到一个错误
NotImplementedError: annotate() + distinct(fields) is not implemented.
我找到了一些依赖于 Django 数据库特定功能的答案,但我想找到一个与底层关系数据库无关的解决方案。
【问题讨论】:
-
好吧,你永远不能 100% 不可知:django 在 ORM 中提供的所有功能在某种程度上都与 relational 数据库提供的通用功能相关,但还有其他类型的graphical 和级联(例如 MongoDB)等数据库。
-
你是对的,我应该澄清我的意思是关系。我会更新我的问题。
-
注解
value字段是什么意思? -
抱歉,应该是
attendance。我会再更新一次! -
所以,如果我理解您要正确执行的操作,您是在尝试弄清楚有多少人将参加一个活动,比如音乐会?
标签: django django-queryset django-database