我有一个User
模型和一个Playlist
模型,其中将user_id
称为foreign key
models.py
class User(db.Model):
__tablename__ = 'users'
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
playlists = db.relationship("Playlist",
backref=db.backref('user'),
uselist=True)
def serialize(self):
"""Return object data in easily serializeable format"""
return {
'id': self.id,
'playlists' : self.playlists}
class Playlist(db.Model):
"""
Model for storing playlist information belonging to a specific user
"""
__tablename__ = 'playlist'
id = db.Column(db.Integer, primary_key=True)
title = db.Column(db.String(50))
user_id = db.Column(db.Integer, db.ForeignKey('users.id'))
@property
def serialize(self):
"""Return object data in easily serializeable format"""
return {
'id' : self.id,
'created' : self.created,
'title': self.title,
}
methods.py
def Upload_Tracks(dataset):
try:
playlist = Playlist.query.filter(Playlist.title == 'Cache').first()
if not playlist:
# create one
playlist = Playlist(title='Cache',
user=User.query.get(1))
db.session.add(playlist)
db.session.commit()
db.session.commit()
else:
playlist = Playlist.query.filter(
and_(Playlist.title == 'Cache', User.id == 1)).first()
# handler errors
except (exc.IntegrityError, ValueError):
db.session.rollback()
return {"status": True}
在的第一次迭代中,创建了播放列表ADDED NEW <Playlist 'Cache'>
,但是在第二次迭代中,当代码到达else
时,我在这里获得了AttributeError: 'NoneType' object
作为播放列表:
playlist = Playlist.query.filter(
and_(Playlist.title == 'Cache', User.id == 1)).first()
如果我查询仅过滤一个属性,就像这样:
playlist = Playlist.query.filter(
(Playlist.title == 'Cache')).first()
有效。
那我如何同时按标题和user_id查询播放列表?
答案 0 :(得分:0)
您收到上述错误,是因为您尝试调用User.id属性,但没有将该模型(表)与播放列表模型(表)连接。 SQL具有用于联接两个表(LEFT,RIGHT,INNERJOIN ...)的JOIN。 您使用的SQLAlchemy通过使用join方法来处理此原始SQL。 因此,您必须使用join()方法来连接两个表(模型)。
playlist = Playlist.query.join(User, User.id == Playlist.user_id).filter(
and_(Playlist.title == 'Cache', User.id == 1)).first()
如果没有这样的行,您将获得播放列表,即“无”(如果db中没有这样的行)或“对象”。