Django注释模型并过滤特定值

时间:2018-08-06 13:19:09

标签: python django django-annotate

我正尝试加入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图表)

1 个答案:

答案 0 :(得分:2)

如果我对它的理解正确,那么您想检查给定RegistrationCustomer的{​​{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_YESminb中的em> minimum 。因此,如果相关brought_signature中的Registration个是brought_signature(在通常为Registration的数据库中),则False是{{ 1}}。如果所有0Min(..)(在通常为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