多对多关系中的相关记录数 [英] Count of related records in many-to-many relationship
本文介绍了多对多关系中的相关记录数的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我正在尝试构建一个类方法,它返回与项目关联的成员数.我试过了:
I am trying to buit a classmethod, which returns number of members associated with a project. I tried:
# method of class Project
@classmethod
def member_count(cls, project_id):
return Session.query(ProjectMember).\
filter(ProjectMember.project_id==project_id).count()
多对多关系定义为:
class Member(Base):
__tablename__ = 'member'
id = Column(Integer, primary_key=True)
login = Column(String(50), unique=True, nullable=False)
project_list = relationship("ProjectMember", backref="member")
class Project(Base):
__tablename__ = 'project'
id = Column(Integer, primary_key=True)
name = Column(String(100), unique=True, nullable=False)
class ProjectMember(Base):
__tablename__ = 'project_member'
project_id = Column(Integer, ForeignKey("project.id"), nullable=False, primary_key=True)
member_id = Column(Integer, ForeignKey("member.id"), nullable=False, primary_key=True)
project = relationship("Project", backref = "project_member")
is_pm = Column(Boolean, default = True, nullable = False)
UniqueConstraint('project_id', 'member_id')
谢谢!
推荐答案
或者使用像下面这样的简单属性,它将使用实例的当前会话来获取孩子的数量
Either use a simple property like below, which will use the current session of the instance to get count of children
class Project(...):
# ...
@property
def member_count_simple(self):
return object_session(self).query(ProjectMember).with_parent(self).count()
print(my_proj.member_count_simple) # @note: will issue an SQL statement
或使用混合属性
:
class Project(Base):
# ...
@hybrid_property
def member_count(self):
return object_session(self).query(ProjectMember).with_parent(self).count()
@member_count.expression
def _member_count_expression(cls):
q = select([func.count(ProjectMember.project_id)]).\
where(ProjectMember.project_id == cls.id).\
label("member_count")
return q
... 在这种情况下,您可以在查询中使用此表达式(例如,filter
s 和 order_by
):
... in which case you can use this expression in your query (filter
s and order_by
, for example):
qry = (session.query(Project, Project.member_count)
.order_by(Project.member_count.desc())
)
# @note: it returns tuples (Project, member_count)
for (proj, cnt_mem) in qry.all():
print(proj.name, cnt_mem)
这篇关于多对多关系中的相关记录数的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文