Python 选择与SQLAlchemy相关的条件

Python 选择与SQLAlchemy相关的条件,python,sql,sqlalchemy,Python,Sql,Sqlalchemy,拥有此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') 如您所见,Posts可以有子对

拥有此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
s可以有子对象(即
Post
s对象,其
Post\u父对象
不是0)。对于从数据库中检索的每个
Post
I,都会进行选择以检索其子项。没关系


但是,在我的数据库设计中,
Post
s(其Post\u父项不是0)不能有子项(即来自父项Post的子项不能有更多子项)。但是要检索它们的选择已经完成。如何避免这种情况?

在关系术语中,此处的任何帖子都可以有子帖子对象,因为所有帖子对象都有一个主键,因此可以有任意数量的帖子对象使用该键作为帖子的父对象。所以说somepost.children必须发出SQL,否则SQLA将无法提供正确的结果。如果您的模型有一些特殊的规则,一些Post对象在不查询DB的情况下没有子对象,那么您需要有条件地访问“somepost.children”。但是,从关系的角度来看,“post_父对象不是0的post对象不能有子对象”的断言是不正确的。此关系配置为一对多,因此任何Post都可以有与其Post_父项无关的子项


另一方面,如果你真的想让Post.children是一个单数,多对一的特殊Post,那么你需要在这个关系()上设置
remote\u side=Post\u id
,如果在这种情况下parent\u Post是None(虽然不是零,这是一个非空值),你就不会得到懒散的负载('Post',primaryjoin=“和(Post.Post\u id==Post.Post\u父项,Post.Post\u父项==0)”??另一件事是,您可以将其标记为lazyload,这样,除非您特别尝试访问children属性,否则它不会运行该附加的SQL@Trent
无法确定关系“Post.children”的关系方向-联接条件中的外键列同时存在于父级和子级的映射表中。请确保只有那些引用父列的列通过foreign()注释或通过foreign_keys参数标记为foreign。