簡體   English   中英

如何搜索Flask SQLAlchemy的多對多關系表?

[英]How can I search the table of a Flask SQLAlchemy many to many relationship?

我有以下模型和表格:

chat_members = db.Table('chat_members',
    db.Column('user_id', db.Integer, db.ForeignKey('user.id')),
    db.Column('chat_id', db.Integer, db.ForeignKey('chat.id'))
)

class chat(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    start_date = db.Column(db.DateTime)
    chat_memb = db.relationship('user', secondary=chat_members, backref=db.backref('members', lazy='dynamic'))  
    chat_line = db.relationship('line', backref='chat_line', lazy='dynamic')

    def __repr__(self):
        return '<Chat %r>' % (self.id)

class user(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    user_email = db.Column(db.String, unique=True)
    user_password = db.Column(db.String)
    lines = db.relationship('line', backref='line_author', lazy='dynamic')

    def __repr__(self):
        return '<User %r>' % (self.user_email)

class line(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    published_date = db.Column(db.DateTime)
    chat_id = db.Column(db.Integer, db.ForeignKey('chat.id'))
    sent_by = db.Column(db.Integer, db.ForeignKey('user.id'))
    line_text = db.Column(db.String)


    def __repr__(self):
        return '<Line %r>' % (self.id)

我已經成功將數據添加到所有這些模型中,但是查詢表時遇到了麻煩。 該查詢的最終目標是查找與特定用戶關聯的所有聊天記錄。 這是我所做的:

first_user = user.query.get(1)
chat.query.filter(chat_members.any(chat_memb=first_user)).all()

我到了

sqlalchemy.exc.InvalidRequestError:無法將集合與對象或集合進行比較; 使用contains()測試成員資格。

這個問題(http://stackoverflow.com/questions/12593421/sqlalchemy-and-flask-how-to-query-many-to-many-relationship)看起來很相似,但是當我為模型復制它時,我得到了AttributeError: type object 'chat' has no attribute 'members'執行后AttributeError: type object 'chat' has no attribute 'members'

chat.query.filter(chat.members.any(user_email='ACCEPTABLE_EMAIL')).all()

由於memberschat模型中的backref,因此回溯令人驚訝,但是我覺得此查詢接近。

我可以找到的其他相關問題似乎並未在同一搜索中提供建議,並且在官方或第三方多對多文檔中也找不到此類問題。

您需要在查詢中使用聯接。 首先將您的chat.chat_memb關系更改為:

# Change backref from 'members' to 'chats', since the backref will be pointing
# to chat class.
chat_memb = db.relationship('user', secondary=chat_members,
                            backref=db.backref('chats', lazy='dynamic'))

然后使用以下查詢:

chat.query.join(user.chats).filter(user.id == 1).all()

我還建議遵循Python樣式准則,並為類使用大寫名稱,例如Chat而不是chat 現在很容易混淆代碼中的類和實例。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM