首页 > 解决方案 > Django注释模型并过滤特定值

问题描述

我试图进入 djangos 注释,但不能完全弄清楚它是如何工作的。

我有一个函数,我想注释客户的查询集,过滤它们并返回客户的数量

def my_func(self):
    received_signatures = self.customer_set.annotate(Count('registrations').filter().count()

现在对于过滤器部分,这就是我在弄清楚如何做到这一点时遇到的问题。我要过滤的是 my 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) 仅在我的参与者处标记bred_signature(这意味着他为他的所有注册带来了签名)或 B) 为他拥有的每个注册标记bred_signature

对于这种情况,选项 B) 是相关的。我用received_signatures我检查客户是否为他的状态为“1_YES”的每个注册带来了每个签名,我想计算所有这样做的客户并返回一个数字(然后我在另一个函数中用于 pygal 图表)

标签: pythondjangodjango-annotate

解决方案


如果我理解正确,您想检查给定with的所有s 是否应该具有 as attribute ,并且至少应该有这样的值。有几种方法可以做到这一点。RegistrationCustomerstatus == '1_YES.brought_signature = True

我们可以这样写:

received_signatures = self.customer_set.filter(
    registration__status='1_YES'
).annotate(
    minb=Min('registration__brought_signature')
).filter(
    minb__gt=0
).count()

所以我们这里首先.filter(..)registration具有 as status 的 s 进行1_YES计算,然后为每个客户计算一个值minb,该值是这些s中的最小值。因此,如果相关s 中的一个是(在通常是 的数据库中),那么也是。如果所有s 都是(在通常是 的数据库中),那么结果是,然后我们可以过滤应该因此大于的事实。brought_signatureRegistrationbrought_signatureRegistrationFalse0Min(..)Falsebrought_signatureTrue11minb0

所以Customers with no Registration被计算在内,Customers with no Registrationwith status1_YES将不被计算在内,Customers with Registrations 有一个Registrationwith status 1_YES,但 withbrough_signature不会被计算在内。仅Customer计算所有 Registration具有状态的 s 1_YES(不是所有 Registrations)都具有的 s brough_signature = True


推荐阅读