Я хочу получить результаты, только если для каждой категории игры эта категория находится в списке идентификаторов, выполнение следующих действий не работает.Game.categories - это hybrid_property, который предоставляет мне категории игр.
Это запрос, который я выполняю, ожидая получить список всех игр, в которых есть хотя бы одна категория в списке идентификаторов, которые я указываю.
games = Game.query \
.filter([category.id for category in Game.categories].in_([1, 2, 3])) \
.paginate(page, current_app.config['POSTS_PER_PAGE'], False)
Мой models.py это.Обратите внимание, что категории каждой игры зависят от количества, которое категория была определена пользователем.
class CategoryUpvote(db.Model):
id = db.Column(db.Integer, primary_key=True)
user_id = db.Column(db.Integer, db.ForeignKey('user.id'))
category_id = db.Column(db.Integer, db.ForeignKey('category.id'))
game_id = db.Column(db.Integer, db.ForeignKey('game.id'))
class Category(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(32))
class Game(db.Model):
id = db.Column(db.Integer, primary_key=True)
title = db.Column(db.String(255), index=True, unique=True)
category_upvotes = db.relationship('CategoryUpvote', backref='category', lazy='dynamic', cascade="save-update, merge, delete")
def add_upvote(self, category, user):
if not self.is_upvoted(category, user):
upvote = CategoryUpvote(category_id=category.id, game_id=self.id, user_id=user.id)
db.session.add(upvote)
else:
upvote = self.category_upvotes.filter(CategoryUpvote.category_id == category.id, CategoryUpvote.user_id == user.id, CategoryUpvote.game_id == self.id).first()
db.session.delete(upvote)
def is_upvoted(self, category, user):
return self.category_upvotes.filter(CategoryUpvote.category_id == category.id, CategoryUpvote.user_id == user.id, CategoryUpvote.game_id == self.id).count() > 0
@hybrid_property
def categories(self):
return Category.query \
.filter(CategoryUpvote.game_id == self.id, CategoryUpvote.category_id == Category.id) \
.group_by(Category.id) \
.order_by(db.func.count(CategoryUpvote.game_id).desc()) \
.limit(5) \
.all()
Я получаю эту ошибку
'list' object has no attribute 'in_'
Как я могу каким-то образом запустить фильтр для каждой категории aигра имеет?например,
.filter(Game.categories[0].in_([1, 2, 3]), Game.categories[1].in_([1, 2, 3]), Game.categories[2].in_([1, 2, 3])) \
Также, если бы в Game была каждая категория в качестве внешнего ключа, я мог бы сделать что-то вроде этого
Game.query.join(Category).filter(Category.id.in_([1, 2, 3]))
Как сделать что-то подобное с hybrid_property?