使用SQLalchemy从表中获取用户列表

时间:2017-11-08 10:55:15

标签: python mysql sqlalchemy flask-sqlalchemy

我有这样的模特。

class Message(db.Model, CRUDMixin):
    id = db.Column(db.Integer, primary_key=True, nullable=False)
    from_id = db.Column(db.Integer, db.ForeignKey("user.id"), nullable=False)
    to_id = db.Column(db.Integer, db.ForeignKey("user.id"), nullable=False)
    from_user = db.relationship('User', foreign_keys=[from_id], uselist=False)
    to_user = db.relationship('User', foreign_keys=[to_id],
                          uselist=False)
    date = db.Column(db.TIMESTAMP(), nullable=False)
    content = db.Column(db.String(500), nullable=False)
    room_id = db.Column(db.Integer, db.ForeignKey("room.id"), nullable=False)

我想要实现的是,对于给定user_id,我想获取用户已向其发送消息的用户列表或用户已从哪些用户接收消息。

例如:

考虑有3个用户使用ID 1,2,3

发送的消息

1 -> 2

2 -> 1

1 -> 3

3 -> 2

现在,对于用户ID 1,我希望获得ID为2和3的用户列表。对于用户2,我将为1和3。

如何实现这一目标?

提前致谢。

2 个答案:

答案 0 :(得分:0)

实现目标的一种方法是采用符合条件的用户联盟。

user_id = 1

messaged_to = User.query.\
    join(Message, Message.to_id == User.id).\
    filter(Message.from_id == user_id)

messages_from = User.query.\
    join(Message, Message.from_id == User.id).\
    filter(Message.to_id == user_id)

query = messaged_to.union(messages_from)

答案 1 :(得分:0)

我的答案如下:

def get_users(user_id):
    messages = cls.query.filter(or_(cls.from_id == user_id, cls.to_id == user_id)).subquery()

    users = User.query.join(messages, or_(messages.c.to_id == User.id,
                           messages.c.from_id == User.id)).filter(User.id != user_id)

    return users