嘗試在 Django ORM 查詢中使用相關對象的字段總數

亞當·斯塔爾

假設我有兩個模型:

class Task(Model):
    duration = models.IntegerField(default=100)

class Record(Model):
    minutes_planned = models.IntegerField(default=0)
    task = models.ForeignKey(Task, related_name=records)

我想獲取所有相關記錄中計劃的總分鐘數低於對象持續時間的所有對象。我一直無法在文檔中找到解決方案。有人可以指點我嗎?

Task.objects.filter(duration__gt=F('records__minutes_planned')))

Task.objects.filter(duration__gt=Sum('records__minutes_planned'))

Task.objects.filter(duration__gt=Sum(F('records__minutes_planned')))

但到目前為止沒有任何效果。第一個成功運行,但據我所知,它對它們進行了逐一比較,而不是與所有記錄的總數進行比較。

似乎 Sum 僅限於在.aggregate(). 但是,我想檢索對象本身,而不是一組值,這就是.aggregate()給我的。

更新:找到這部分看起來很有希望的文檔

亞當·斯塔爾

這是作為模型管理器編寫的最終解決方案:

from django.db.models import Manager, OuterRef, Subquery, Sum
from django.db.models.functions import Coalesce

class TaskManager(Manager):

    def eligible_for_planning(self, user):
        from .models import Record
        records = Record.objects.filter(task=OuterRef('pk')).order_by().values('task')
        minutes_planned = records.annotate(total=Sum('minutes_planned')).values('total')
        qs = self.model.objects.filter(user=user, status=ACTIONABLE, duration__gt=Coalesce(Subquery(minutes_planned), 0))
        return qs

我們基本上是在構建第二個查詢來獲取第一個查詢所需的值。

在這種情況下,records是第二個查詢(或SubQuery),它通過在此管理器中查詢的任務的 pk 過濾記錄。

然後,minutes_planned返回將與任務的duration.

最後,整個事情作為一個Subquery對象插入到查詢集中如果Coalesce沒有找到 Record 對象,請將其包裝在 a 中並添加默認值。就我而言,這是零。

參考

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用Django ORM添加列

来自分类Dev

使用php写入django ORM

来自分类Dev

在Django ORM中使用Haystack结果

来自分类Dev

如何在Django ORM中使用GROUP BY

来自分类Dev

Django ORM:递归多对多字段联接

来自分类Dev

使用Django ORM进行高级订购

来自分类Dev

使用Django-orm查询多个对象

来自分类Dev

使用Django ORM计算组合(CROSS JOIN)

来自分类Dev

为此目的使用Django ORM查询

来自分类Dev

Django使用ORM循环到无循环

来自分类Dev

Django Channels中间件使用ORM

来自分类Dev

使用开始限制的Django ORM限制QuerySet

来自分类Dev

使用Django ORM进行高级订购

来自分类Dev

在python / django orm中正确使用异常

来自分类Dev

使用Django-orm查询多个对象

来自分类Dev

如何使用Django ORM编写MID()查询

来自分类Dev

使用Django ORM检索最近的行

来自分类Dev

嘗試使用 wget 下載帶零的圖像

来自分类Dev

Django项目外使用的Django ORM导致“ MySQL消失了”

来自分类Dev

Django项目外使用的Django ORM导致“ MySQL消失了”

来自分类Dev

如何使用Django ORM获得额外的计数字段?

来自分类Dev

在Django ORM中使用postgresql窗口函数的干净方法?

来自分类Dev

在python库中使用Django ORM会引起麻烦吗?

来自分类Dev

如何在 Django ORM 查询中的列中使用 timedelta?

来自分类Dev

Django ORM跨产品

来自分类Dev

AJAX的Django ORM问题

来自分类Dev

左加入Django ORM

来自分类Dev

Django ORM内部联接

来自分类Dev

Join with subquery in Django ORM