在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)
答案 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过滤器实现要求,但是您可以从上面派生出正确的实现。