Python SqlAlchemy查询以选择没有子项的行

Python SqlAlchemy查询以选择没有子项的行,python,sqlalchemy,Python,Sqlalchemy,我有一个Tag表,它可以有一个相同类的父Tag 我需要一个查询来返回所有标记实例,而不返回任何子实例 以下是SqlAlchemy类的代码: class Tag(db.Model): __tablename__ = 'tags' id = db.Column(db.String(32), primary_key=True) name = db.Column(db.String(45),nullable=False) subject_id = db.Column(d

我有一个
Tag
表,它可以有一个相同类的父
Tag

我需要一个查询来返回所有
标记
实例,而不返回任何子实例

以下是SqlAlchemy类的代码:

class Tag(db.Model):
    __tablename__ = 'tags'

    id = db.Column(db.String(32), primary_key=True)
    name = db.Column(db.String(45),nullable=False)
    subject_id = db.Column(db.Integer, db.ForeignKey('subjects.id'), nullable=False)
    parent_tag_id = db.Column(db.Integer, db.ForeignKey('tags.id'), nullable=True)

    subject = db.relationship('Subject', backref=db.backref('tags', lazy='dynamic'))
    parent_tag = db.relationship('Tag',
                                 remote_side=[id],
                                 backref=db.backref('children', lazy='dynamic'))

    def __init__(self, name, subject_id, parent_tag_id=None):
        self.id = uuid.uuid4().hex
        self.name = name
        self.subject_id = subject_id
        self.parent_tag_id = parent_tag_id
以下是我对该查询的最佳尝试:

def get_all_subject_tags_ordered():
    _child_tag = aliased(Tag)
    return db.session.query(Tag)\
        .join(_child_tag, Tag.children)\
        .filter(func.count(Tag.children) == 0)\
        .filter(Tag.subject_id.isnot(None))\
        .order_by(Tag.name)\
        .all()
这给了我一个错误:

sqlalchemy.exc.ProgrammingError:(pymysql.err.ProgrammingError)(1111, u‘组函数的使用无效’[SQL:u‘选择tags.id作为tags\u id, tags.name作为tags\u name,tags.subject\u id作为tags\u subject\u id, tags.parent\u tag\u id作为标记\u parent\u tag\u id\n来自标记内部连接标记 作为tags.id上的tags\u 1=tags\u 1.parent\u tag\u id\n在何处计数(tags.id= tags.parent_tag_id)=%(count_1)s和tags.subject_id不为空 按标记排序。名称'][参数:{u'count_1':0}]


非常感谢您的帮助。

一般来说:
db.session.query(Parent.filter)(Parent.children==None)
将查找所有不带
子对象的
父对象

因此,请尝试:

return db.session.query(Tag)\
    .filter(Tag.children == None, Tag.subject_id != None)\
    .order_by(Tag.name)\
    .all()

一般来说:
db.session.query(Parent).filter(Parent.children==None)
将查找所有
Parent
s,其中没有
子项

因此,请尝试:

return db.session.query(Tag)\
    .filter(Tag.children == None, Tag.subject_id != None)\
    .order_by(Tag.name)\
    .all()

我还建议您参考以下内容,在这种情况下,您可以尝试:
.filter(~Tag.children.any())
。这两种解决方案都非常有效。非常感谢:)我也向您介绍了这一点,在这种情况下,您可以尝试:
.filter(~Tag.children.any())
。这两种解决方案都非常有效。非常感谢:)