Flask-Sqlalchemy:过滤列包含某个对象的行

时间:2018-07-08 09:11:44

标签: python flask sqlalchemy flask-sqlalchemy

我具有以下数据库设置:

abcs = db.Table('abcs',
    db.Column('hero_id', db.Integer, db.ForeignKey('hero.id')),
    db.Column('player_id', db.Integer, db.ForeignKey('player.id')),
    db.Column('game_id', db.Integer, db.ForeignKey('game.id'))
)

class Player(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(250), nullable=False)
    account_id = db.Column(db.String(250), nullable=False, unique=True)

class Hero(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    hero_id = db.Column(db.Integer, unique=True)
    localized_name = db.Column(db.String)
    url_small_portrait = db.Column(db.String)
    url_large_portrait = db.Column(db.String)
    url_full_portrait = db.Column(db.String)
    url_vertical_portrait = db.Column(db.String)

class Game(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    mmr = db.Column(db.Integer)
    server_steam_id = db.Column(db.Integer)
    match_id = db.Column(db.Integer)
    lobby_id = db.Column(db.Integer)
    activate_time = db.Column(db.Integer)
    deactivate_time = db.Column(db.Integer)
    duration = db.Column(db.Integer)
    has_pro = db.Column(db.Integer, default=-1)
    radiant_win = db.Column(db.Integer)

    players = db.relationship("Player", secondary = abcs, lazy='subquery',
        backref=db.backref('games', lazy=True))
    heroes = db.relationship("Hero", secondary = abcs, lazy='subquery',
        backref=db.backref('games', lazy=True))

这意味着每当我向“游戏”表中添加条目时,Game.players都会返回一个列表,其中包含“玩家”类型的对象。

现在我想做的就是查询表格

p = Player.query.filter(P.account_id == 12345).first()
games = Game.query.filter(*get all games where Game.players contain p*).all()

我对第二行的第一个幼稚方法是

games = Game.query.filter(Game.players.contains(p)).all()

并确实返回“游戏”中的所有条目,其中Game.players出于某种原因包含p,但出于某种原因,使用 .contains 更改了每一行.player中元素的顺序,例如列表

games[0].players
与直接查询特定游戏的情况相比,

现在的顺序有所不同。

所以基本上,我在问我如何实现自己想做的事情-如何查询表中包含特定玩家的所有游戏?

1 个答案:

答案 0 :(得分:0)

在查询中使用import cv2 print(__version__) ,以确保获得可预测的订单。例如

opencv-contrib-python