SQALCHEMY-按属性和user_id进行查询过滤

时间:2019-04-15 16:43:00

标签: flask-sqlalchemy

我有一个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查询播放列表?

1 个答案:

答案 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中没有这样的行)或“对象”。