【问题标题】:In Django ORM filter objects by annotation on the group by在 Django ORM 中,通过组上的注释过滤对象
【发布时间】:2021-05-25 12:10:54
【问题描述】:

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

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

【问题讨论】:

  • 你的意思是“一个用户每天所有时长的总和大于 x”吗?
  • 我认为这更像是一个建模问题:你应该制作一个模型A,它有一个user/date,然后是一个模型(B),它有一个FK在A 上并且有一个持续时间,那么这很容易。
  • @IainShelvington 没有。我的意思是“我想要它们的 daily_duration 大于 x 的所有对象”
  • @WillemVanOnsem 我同意这样会容易得多。

标签: django django-models group-by django-orm


【解决方案1】:

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

  • 首先我按用户和日期分组,注释每日持续时间并对其进行过滤
  • 然后我再次过滤来自第一个查询的情侣(用户、日期)
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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-11-27
    • 2018-11-18
    • 1970-01-01
    • 2010-11-04
    • 2017-05-05
    • 2016-09-05
    相关资源
    最近更新 更多