拥有这个SQLAlchemy模型:
class Post(db.Model):
__tablename__ = 'posts'
post_id = db.Column(db.Integer, primary_key=True)
post_parent = db.Column(db.Integer, db.ForeignKey('posts.post_id'))
children = db.relationship('Post')
如您所见,Post
可以有子项(即Post
不为0的post_parent
个对象。对于从数据库中检索的每个Post
,都会生成一个SELECT以检索其子项。没关系。
但是,在我的数据库设计中,post_parent不为0的Post
不能有子项(即父帖子中的子项不能再包含子项)。但是要检索它们的SELECT。我怎么能避免这种情况?
答案 0 :(得分:2)
在关系术语中,这里的任何Post都可以有子Post对象,因为所有Post对象都有一个主键,因此可以有任意数量的Post对象具有post_parent的那个键。所以说somepost.children必须发出SQL,否则SQLA将无法提供正确的结果。如果你的模型有一些特殊规则,一些Post对象在没有查询数据库的情况下就知道没有子节点,你需要有条件地访问“somepost.children”。但是,从关系的角度来看,你的断言“发布post_parent不为0的对象不能生孩子”是不正确的。此关系配置为一对多,因此任何Post都可以拥有与post_parent无关的子项。
如果另一方面你真的意味着Post.children是一个单一的,多对一的特定帖子,那么你需要在那个关系()上设置remote_side=post_id
,你不会如果在这种情况下parent_post为None,则获取lazyload(虽然不是零,但这是非NULL值)。