我有一个名为ExtendedUser
的表,它与User
表上的一个backref为extended_user
的User
表有一对一的关系。User
表与UserPosts
表有一对多关系,在User
表上有一个名为posts
的backref。在
class User(Base):
__tablename__ = "users"
id = Column(Integer, primary_key=True)
class UserPost(Base):
__tablename__ = "user_posts"
id = Column(Integer, primary_key=True)
user_id = Column(Integer, ForeignKey("users.id"))
user = relationship("User", backref="posts")
class ExtendedUser(Base):
__tablename__ = "extended_users"
user_id = Column(Integer, ForeignKey("users.id"), primary_key=True)
user = relationship("User", backref="extended_user", uselist=False, lazy="joined")
从ExtendedUser
开始,我想选择所有ExtendedUser
,它们的User
s没有post。
所以我没能成功
但这不起作用,我得到一个错误:
^{3}$如何对查询建模,以便只有ExtendedUser
的User
返回{
发生错误是因为
.user
属性是不同的,这取决于您是从类访问它,还是从类的实例访问它。例如,这会引发您正在获取的异常:这是因为访问类
ExtendedUser
上的.user
返回一个InstrumentedAttribute
对象,InstrumentedAttribute
的实例没有名为posts
的属性。在这是有效的:
^{pr2}$上面的操作是因为我们访问了
.user
,它返回了User
的一个实例,该实例返回了一个名为posts
的属性的实例。在类和实例属性访问之间的这种不同行为是由Python的descriptor protocol控制的。在
实现目标的一种方法是使用子查询来查询}的{}不在结果中:
^{3}$user_posts
表中唯一的user_id
,并测试{下面是一个有效的示例,但首先我必须稍微更改
ExtendedUser.user
的定义:注意使用了上设置
backref
函数,它允许我在^{uselist=False
。您的示例在ExtendedUser.user
上有uselist=False
,但由于外键是在ExtendedUser
上定义的,所以ExtendedUser.user
只能指向一个用户,sqlalchemy会自动知道集合不应该是一个列表。如果没有这个改变,我会得到一个TypeError: Incompatible collection type: ExtendedUser is not list-like
异常。在好的,下面是一个例子:
相关问题 更多 >
编程相关推荐