如何解决我可以在编写查询时而不是在模型类中指定关系的联接条件吗?
我有三种型号...
class Customer(db.Model,TimestampMixin):
pk = db.Column(db.Integer,primary_key=True)
name = db.Column(db.Text,nullable=False)
class User(db.Model,nullable=False)
class CustomerUserStat(db.Model):
__table_args__ = (
UniqueConstraint("customer_pk","user_pk",name="customer_pk_user_pk"),)
pk = db.Column(db.Integer,primary_key=True)
customer_pk = db.Column(db.Integer,db.ForeignKey("customers.pk"),nullable=False)
user_pk = db.Column(db.Integer,db.ForeignKey("users.pk"),nullable=False)
data = db.Column(db.Integer,nullable=False,default=0)
我尝试过...
m.Customer.query.outerjoin(
m.CustomerUserStat,(m.CustomerUserStat.user_pk == entity.pk)
& (m.CustomerUserStat.customer_pk == m.Customer.pk)
).add_entity(m.CustomerUserStat)
但是,这给了我一个带有Customer对象和CustomerUserStat的元组(如果不存在,则为None),但是关闭的不是我想要的。
我还尝试将userstats关系添加到Customer模型,然后...
m.Customer.query.outerjoin(m.Customer.userstats
).filter(m.CustomerUserStat.user_pk == user.pk
).options(contains_eager(m.Customer.userstats))
但是,如果用户的CustomerUserStat记录丢失,则不会产生任何结果。
最终,我想编写一个查询,该查询将给我一个Customer对象的列表,该对象的属性具有我在查询中指定的用户的CustomerCustomStat实例,我需要能够通过CustomerUserStat进行订购.data字段并分页结果。
解决方法
在我看来,您正在寻找AssociationProxy pattern
,我想出了这个技巧来获取所需的查询。在我的Flask视图函数中,我定义了一个新类,该类从原始类继承并向其添加关系。然后,我使用新类创建查询。
class TempCustomer(m.Customer):
userstats = db.relationship(
m.CustomerUserStat,primaryjoin=(m.Customer.pk == m.CustomerUserStat.customer_pk) &
(m.CustomerUserStat.user_pk == agent.pk),uselist=False,viewonly=True,lazy="joined",)
q = TempCustomer.query.outerjoin(m.CustomerUserStat,(m.Customer.pk ==
m.CustomerUserStat.customer_pk) & (m.CustomerUserStat.user_pk == agent.pk),)
这对我有用,但似乎不是最佳解决方案。
对于相同的数据,这还会导致两个LEFT JOINS,这可能不是最有效的。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。