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' 值的总和进行比较。如果前者大于或等于,请求可以被视为已完成
我有 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' 值的总和进行比较。如果前者大于或等于,请求可以被视为已完成