首页 > 解决方案 > 在 Django ORM 中,通过组上的注释过滤对象

问题描述

我有这个模型,我需要过滤同一用户的每日持续时间大于值 X 的所有对象 A。

class A(models.Model):
    user = models.ForeignKey(User)
    day = models.CharField(choices=["monday", "tuesday" ... "sunday"])
    duration = models.FloatField()

标签: djangodjango-modelsgroup-bydjango-orm

解决方案


目前我的解决方案如下,但对我来说似乎很难看:

  • 首先,我按用户和日期分组,注释每日持续时间并对其进行过滤
  • 然后我再次过滤来自第一个查询的情侣(用户,天)
group_by_user_day = A.objects
    .values("user", "day")
    .order_by("user", "day")
    .distinct()
    .annotate(daily_duration=Sum("duration"))
    .filter(daily_duration__gt=X)

q_objects = Q()
for item in group_by_user_day:
    q_objects |= Q(user=item["user"], day=item["day"])
results = A.objects.filter(q_objects)

推荐阅读