我有一个User
模型和Playlist
模型,它引用user_id
作为foreign key
models.朋友
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.朋友
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()
有用。
那么如何通过标题AND user_id同时查询播放列表呢?
您收到上述错误,因为您尝试调用User.id属性但未加入该模型(表)与播放列表模型(表)。 SQL有JOIN来连接两个表(LEFT,RIGHT,INNERJOIN ......)。您使用的SQLAlchemy使用join方法处理此原始SQL。所以你必须使用join()方法来连接两个表(模型)。
playlist = Playlist.query.join(User, User.id == Playlist.user_id).filter(
and_(Playlist.title == 'Cache', User.id == 1)).first()
您将获得播放列表为None(如果在db中没有这样的行)或者Object,如果有这样的行。