如何选择没有关系的行

时间:2015-03-20 16:12:00

标签: python sqlalchemy flask-sqlalchemy flask-admin

在Sqlalchemy中给出了一对多的关系:

class Menu(db.Model):
    __tablename__ = 'menus'
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(100), index=True, unique=True)

class MenuImage(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    url = db.Column(db.String(128))
    menu_id = db.Column(db.Integer, db.ForeignKey(Menu.id))
    menu = db.relation(Menu, backref='images')

如何在菜单中选择没有图像的行。我可以过滤具有图像但不是其他方式的行。在flask-admin过滤器上,我会写如下:

class FilterHasImage(BaseSQLAFilter):
    def apply(self, query, value):
        // I dont understand where the 'query' came from
        if value == '1':
            return query.filter(self.column is not None)
        else:
           // HERE IS THE CODE I SHOULD PUT

    def operation(self):
        return 'Has Image'

    def __init__(self, column, name):
        options = (('1', 'Yes'), ('0', 'No'))
        super(FilterHasImage, self).__init__(column, name, options=options)

1 个答案:

答案 0 :(得分:0)

使用RelationshipProperty.Comparator.any。该文档提供了没有任何案例的示例。使用您的模型可能看起来像:

q_nope = db.session.query(Menu).filter(~Menu.images.any())
for menu in q_nope:
    print(menu)

虽然,但您可以执行以下任一操作:

# get Menu items with images (using `.any()`)
q_does = db.session.query(Menu).filter(Menu.images.any())

# get Menu items with images (using inner join, which will filter implicitly)
q_does = db.session.query(Menu).join(Menu.images)

我不知道什么是Flask-Admin过滤器实现要求,但是您可以从上面派生出正确的实现。