gpt4 book ai didi

django - 在 Django 中聚合分组字段时返回对象

转载 作者:行者123 更新时间:2023-12-02 06:32:59 25 4
gpt4 key购买 nike

假设以下示例模型:

# 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 ,我们可以通过使用注释前面的来实现与此接近的效果。

... the original results are grouped according to the unique combinations of the fields specified in the values() clause. An annotation is then provided for each unique group; the annotation is computed over all members of the group.

因此使用示例模型,我们可以编写:

event.objects.values('location', 'type').annotate(latest_date=Max('date'))

它确实按位置和类型对事件进行分组,但不返回出勤字段,这是所需的行为。

我尝试的另一种方法是使用不同的即:

event.objects.distinct('location', 'type').annotate(latest_date=Max('date'))

但我收到错误

NotImplementedError: annotate() + distinct(fields) is not implemented.

我找到了一些依赖于 Django 数据库特定功能的答案,但我想找到一个与底层关系数据库无关的解决方案。

最佳答案

好吧,我想这个可能真的适合你。它基于一个假设,我认为该假设是正确的。

当您创建模型对象时,它们都应该是唯一的。似乎不太可能在同一日期、同一位置、同一类型<发生两个事件/。因此,有了这个假设,让我们开始:(作为格式说明,类名称倾向于以大写字母开头,以区分变量实例。)

# First you get your desired events with your criteria.
results = Event.objects.values('location', 'type').annotate(latest_date=Max('date'))

# Make an empty 'list' to store the values you want.
results_list = []

# Then iterate through your 'results' looking up objects
# you want and populating the list.
for r in results:
result = Event.objects.get(location=r['location'], type=r['type'], date=r['latest_date'])
results_list.append(result)

# Now you have a list of objects that you can do whatever you want with.

您可能需要查找 Max(Date) 的确切输出,但这应该会让您走上正确的道路。

关于django - 在 Django 中聚合分组字段时返回对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50787703/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com