zch*_*zch 1 python sqlalchemy flask
我有以下型号和表格:
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)
Run Code Online (Sandbox Code Playgroud)
我已成功将数据添加到所有这些模型中,但查询表时遇到问题.查询的最终目标是查找与特定用户关联的所有聊天.这是我做的:
first_user = user.query.get(1)
chat.query.filter(chat_members.any(chat_memb=first_user)).all()
Run Code Online (Sandbox Code Playgroud)
我得到了
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'
做完之后
chat.query.filter(chat.members.any(user_email='ACCEPTABLE_EMAIL')).all()
Run Code Online (Sandbox Code Playgroud)
members
回顾与chat
模型中的backref 一样令人惊讶,但我觉得这个查询很接近.
我可以找到的其他相关问题似乎没有提供相同搜索的建议,我在官方或第三方多对多文档中找不到这样的查询.
Aud*_*kas 10
您需要在查询中使用联接.首先将您的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'))
Run Code Online (Sandbox Code Playgroud)
然后使用此查询:
chat.query.join(user.chats).filter(user.id == 1).all()
Run Code Online (Sandbox Code Playgroud)
我还建议遵循Python样式指南并为类使用大写名称,例如Chat
代替chat
.现在很容易在代码中混淆类和实例.
归档时间: |
|
查看次数: |
3870 次 |
最近记录: |