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

问题描述 投票:0回答:1

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

flask-sqlalchemy
1个回答
0
投票

您收到上述错误,因为您尝试调用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,如果有这样的行。

© www.soinside.com 2019 - 2024. All rights reserved.