python - 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 图表)
解决方案
如果我理解正确,您想检查给定with的所有s 是否应该具有 as attribute ,并且至少应该有这样的值。有几种方法可以做到这一点。Registration
Customer
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(..)
对registration
具有 as status 的 s 进行1_YES
计算,然后为每个客户计算一个值minb
,该值是这些s中的最小值。因此,如果相关s 中的一个是(在通常是 的数据库中),那么也是。如果所有s 都是(在通常是 的数据库中),那么结果是,然后我们可以过滤应该因此大于的事实。brought_signature
Registration
brought_signature
Registration
False
0
Min(..)
False
brought_signature
True
1
1
minb
0
所以Customer
s with no Registration
将不被计算在内,Customer
s with no Registration
with status1_YES
将不被计算在内,Customer
s with Registration
s 有一个Registration
with status 1_YES
,但 withbrough_signature
不会被计算在内。仅Customer
计算所有 Registration
具有状态的 s 1_YES
(不是所有 Registration
s)都具有的 s brough_signature = True
。
推荐阅读
- javascript - 在函数后面的代码刚刚填充文本框后调用 javascript
- data-structures - Java应用程序的共享秘密存储/数据结构
- c++ - 是什么导致在多边形的每个三角形上渲染纹理?
- python - 在 init 中使用 contextmanager
- security - TFS 2018 - 为单个仪表板设置权限
- php - 从 Musixmatch 获取歌词
- python-3.x - 是否可以通过 Dash 交互式运行 python 命令?
- vim - 覆盖标签栏中的方法
- java - 来自 java REST 服务的声音播放在 iOS Safari 和 Chrome 中提前结束
- django - 带有 django-rest-auth 和 django-rest-knox 的 AttributeError - 令牌序列化器