2014-11-14 1 views
0

A SportsClass имеет много Courses. Я хочу иметь возможность получить только те курсы, которые доступны.Фильтрация модели на родственной модели по-прежнему показывает связанные объекты, отфильтрованные

Я попытался следующие:

sports_classes = db.session.query(SportsClass).join(Course).filter((SportsClass.description.contains(query))|(SportsClass.name.contains(query))) 
sports_classes = sports_classes.filter((Course.bookable == "bookable") | (Course.bookable == "waitingList")) 

Однако результат, возвращаемый этим запросом (преобразованные в JSON и упрощенный):

[ 
"description": "description", 
    "courses": [ 
     { 
     "name": "Name", 
     "bookable": "waitingList", 
     }, 
     { 
     "name": "Keine Angaben", 
     "bookable": "canceled", 
     } 
    ], 
    } 
] 

Почему отмененный курс также в наборе результатов ? Как я могу получить только доступные курсы для каждого класса?

+0

возможно дубликат [Может содержание отношений быть фильтруется при запросе родительской модели?] (http://stackoverflow.com/questions/26787222/can-the-contents-of-a-relationship-be-filtered-when-querying-parent-model) – davidism

ответ

3

Вы путаете соединение/фильтрацию с объектами, связанными с загрузкой. Ваш текущий запрос фильтрует SportsClass, чтобы убедиться, что не менее его курсов 'bookable' или 'waitingList'. Однако это не влияет на то, что загружается отношениями, которые обрабатываются отдельно от загрузки результатов запроса.

Вместо этого вы, вероятно, хотите получить второе отношение, которое отображает только классы, не отмененные. Затем поместите содержимое этих отношений в выход JSON, а не «полные» отношения.

class SportsClass(db.Model): 
    # ... 

class Course(db.Model): 
    # ... 
    sports_class_id = db.Column(db.Integer, db.ForeignKey(SportsClass.id), nullable=False) 
    sports_class = db.relationship(SportsClass, backref='courses') 

SportsClass.available_courses = db.relationship(
    Course, primaryjoin=db.and_(
     SportsClass.id == Course.sports_class_id, 
     Course.bookable != 'canceled' 
    ), viewonly=True 
) 

(я предполагаю, что в определениях модели, но ключевым элементом является определение и использовать это дополнительное отношение к Course в конце.)

+0

Спасибо за ваше объяснение , Я надеялся на более гибкий способ фильтрации результатов, но я понял, что есть так мало, что я могу просто спуститься к python для фильтрации. Я буду держать ваше решение в виду для больших наборов, хотя! –

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