Django - 基于相关值的嵌套总和进行过滤

Django - Filter based on nested sum of related values

我有 3 个这样的 Django 模型

Request是一个捐赠请求,RequestItem表示需要name项的实例数,Donation表示已经为连接完成了多少次捐赠item

class Request:
    pass


class RequestItem:
    name
    request = ForeignKey(Request)
    needed = IntegerField()


class Donation:
    item = ForeignKey(RequestItem)
    donated = IntegerField()

一个 RequestItem a 被认为是完整的如果

a.needed == Sum(donation.donated 为 a.donation_set.all()

中的每笔捐款

如果

,则称请求 r 已完成

对于 r.request_item_set.all() 中的每个 RequestItem ri; ri 完成了

我需要过滤掉 complete/aren 未完成的请求。

如果您确定 'donated' 的总和永远不会超过每个请求项的 'needed' 的值,您可以这样做:

from django.db.models import Sum, F
Request.objects.annotate(needed=Sum('requestitem__needed', distinct=True), donated=Sum('requestitem__donation__donated')).filter(donated__gte=F('needed'))

此处将每个请求的所有捐赠总和与同一请求的所有 'needed' 值的总和进行比较。如果前者大于或等于,请求可以被视为已完成