Skip to main content
 首页 » 编程设计

python之Django 注释模型并过滤特定值

2024年09月07日34傻小

我正在尝试使用 djangos annotate,但不太清楚它是如何工作的。

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

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 是一个数据库字段

那么我怎样才能注释查询集,过滤 received_signatures 然后返回一个数字呢?

相关模型信息:

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) 仅在我的参与者处标记 brought_signature(这意味着他为他的所有注册带来了签名)或 B)为他的每个注册标记 brought_signature

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

请您参考如下方法:

如果我理解正确,你想检查 all 给定 Customer 的 Registration 是否有 status == '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(..) 在状态为 1_YES 的 registration 上,接下来我们计算对于每个客户,minb 值是这些 Registration 的 brought_signature 的最小值。因此,如果相关 Registration 的 brought_signature 之一是 False(在通常为 0 的数据库中>),那么 Min(..) 也是 False。如果所有 brought_signature 都是 True(在通常为 1 的数据库中),则结果为 1 ,然后我们可以根据 minb 应该大于 0 这一事实进行过滤。

因此没有Registration的Customer将不被计算在内,Customer没有 Registration 且状态为 1_YES 的 s,将不被计算在内,具有 Registration 的 Customer 有状态为 1_YES 但带有 brough_signature 的 Registration 将不被计算在内。只有 Customer 的 all Registration 状态为 1_YES(本身不是 all Registrations) brough_signature = True 被计算在内。