我有以下架构:
Organization
有一个Customer
列表,每个Customer
都有一个Certification
列表。 Customer
通过名为Certification
的模型与OrganizationCustomerMetadata
相关联。 OrganizationCustomerMetadata
有一个字符串key
,一个字符串value
和一个整数customer_id
。它只是一个每个客户的键值存储,除了认证映射之外还有其他东西。当key
是"认证"时,value
是认证ID。 (就在我来到这里的时候。)
我想计算在整个Certification
中每个Customer
应用Organization
的次数。
我写了下面的方法来做到这一点:
def get_user_counts(self, org_id):
if not org_id:
return {}
certs_sql = text(
'''
select certifications.id, count(*) as user_count from certifications
join organization_customer_metadata on value::int = certifications.id and
key = 'certification'
join customers on organization_customer_metadata.customer_id = customers.id
where customers.organization_id = {org_id} and certifications.state = 'ACTIVE'
group by certifications.id;
'''.format(org_id=int(org_id)))
certs_query = db.engine.execute(certs_sql)
return {row[0]: row[1] for row in certs_query}
这是一个较大的API调用的一部分,用于查询和过滤Certification
使用的所有Organization
。在计算了认证计数之后,我将其粘贴到要返回的每个Certification
上,如下所示:
# ...some code here that queries for a bunch of certifications...
user_counts = self.controller.get_user_counts(organization_id)
for cert in certifications:
cert.user_count = user_counts.get(cert.id, 0)
我想用正确的sqlalchemy函数重写所有这些。而且我认为我还应该在user_counts
模型上设置Certification
聚合属性,对吗?我是sqlalchemy的新手,并且在弄清楚如何做到这一点时遇到了很多麻烦。有什么建议吗?