2015-03-20 2 views
0

дали один ко многим отношений в 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') 

Как выбрать строки в меню, которые не имеют изображения. Я могу фильтровать строку с изображением, но не наоборот. В колбу-админ фильтр я буду писать, как-то вроде этого:

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

Использование 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) 

Я не знаю, каковы требования к реализации фильтра Колбы-администратор, но дома вы можете получить правильную реализацию сверху.

Смежные вопросы