我正尝试加入djangos注释,但无法完全弄清楚它是如何工作的。
我有一个功能,可以在其中注释客户的查询集,对其进行过滤并返回客户数量
def my_func(self):
received_signatures = self.customer_set.annotate(Count('registrations').filter().count()
现在是过滤器部分,那就是我在弄清楚如何执行该操作时遇到的问题。我想过滤的是我的received_signatures
,这是我的customer.py
def received_signatures(self):
signatures = [reg.brought_signature for reg in self.registrations.all() if reg.status == '1_YES']
if len(signatures):
return all(signatures)
else:
return None
brough_signature
是一个数据库字段
那么我该如何注释查询集,过滤接收到的签名,然后返回一个数字?
相关型号信息:
class Customer(models.Model):
brought_signature = models.BooleanField(u'Brought Signature', default=False)
class Registration(models.Model):
brought_signature = models.BooleanField(u'Brought Signature', default=False)
status = models.CharField(u'Status', max_length=10, choices=STATUS_CHOICES, default='4_RECEIVED')
注意:参与者和注册可以拥有brought_signature
。我在程序中设置了一个设置,该设置允许我在参与者身上仅标记A带上签名(这意味着他为所有注册都带上了签名),或者在每个注册上标记B带上了签名。
在这种情况下,选项B)是相关的。使用我的received_signatures
,我检查客户是否为状态为“ 1_YES”的每个注册都带来了每个签名,并且我想对所有这样做的客户进行计数并返回一个数字(然后将其用于另一个函数中) pygal图表)
答案 0 :(得分:2)
如果我对它的理解正确,那么您想检查给定Registration
与Customer
的{{1}}的所有status == '1_YES
是否都应具有属性{{1 }},并且至少应 这样的值。有几种方法。
我们可以这样写:
.brought_signature = True
因此,我们要做的是首先在状态为received_signatures = self.customer_set.filter(
registration__status='1_YES'
).annotate(
minb=Min('registration__brought_signature')
).filter(
minb__gt=0
).count()
的{{1}}上.filter(..)
,然后为每个客户计算值registration
,即<这些1_YES
中minb
中的em> minimum 。因此,如果相关brought_signature
中的Registration
个是brought_signature
(在通常为Registration
的数据库中),则False
是{{ 1}}。如果所有0
是Min(..)
(在通常为False
的数据库中),则结果为brought_signature
,然后我们就可以过滤{{1 }}因此应大于True
。
因此{em>否 1
的{{1}}将被计算为 not ,没有1
的{{1}} s将被计数状态minb
的{{1}}与0
的{{1}}的状态为Customer
的{{1}},但Registration
的不计数不会被计算在内。仅Customer
个具有状态Registration
的所有 1_YES
个(本身不是 all 个Customer
s)已计算Registration
。