SQLAlchemy-在Postgres上返回序列化的backref值

时间:2019-05-03 19:04:03

标签: postgresql sqlalchemy

我有一个SQLAlchemy拥有的Postgres数据库:

轨道模型:

class Track(db.Model):
    __tablename__='track'

    """
    Model for storing track information
    """
    id = db.Column(db.Integer, primary_key=True)
    created = db.Column(db.DateTime, default=func.now())
    popularity = db.Column(db.Integer) 
    playing = db.Column(db.Boolean, default=False)   
    user_id = db.Column(db.Integer, db.ForeignKey('users.id'))

    def __init__(self, title, artist, uri): 
        self.title = title
        self.artist = artist
        self.uri = uri

    def serialize(self):
       return {
           'id' : self.id,
           'title': self.title,
           'created': self.created,
           'popularity': self.popularity,
           'playing': self.playing,
       }

播放列表模型:

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))
    created = db.Column(db.DateTime, default=func.now())

    user_id = db.Column(db.Integer, db.ForeignKey('users.id'))

    tracks = db.relationship('Track', 
                        secondary=playlist_tracks,
                        backref=db.backref('playlists', 
                        lazy='dynamic'))   

    def __init__(self, title, user):
        self.title = title
        self.user = user

    def serialize(self):
       """Return object data in easily serializeable format"""
       return {
           'id' : self.id,
           'created' : self.created,
           'title': self.title,
           'tracks': [item.serialize() for item in self.tracks]
       }

我还有这个辅助表:

playlist_tracks = db.Table('playlist_tracks',
    db.Column('track_id', db.Integer, db.ForeignKey('track.id')),
    db.Column('playlist_id', db.Integer, db.ForeignKey('playlist.id')))

在创建playlist对象并将tracks添加到对象之后,如下所示:

playlist.tracks.append(track)
print ('PLAY SERIALIZE',playlist.serialize())
如任务日志所示,将

tracks添加到playlist

[2019-05-02 05:30:26,093: WARNING/ForkPoolWorker-5] PLAY SERIALIZE
[2019-05-02 05:30:26,097: WARNING/ForkPoolWorker-5] {'id': 1, 'created': datetime.datetime(2019, 5, 2, 5, 30, 25, 678181), 'title': 'Cache', 'artist': None, 'tracks': [{'id': 1, 'title': 'Time', 'artist': 'Pink Floyd', 'created': datetime.datetime(2019, 5, 2, 5, 30, 25, 897034)

然后,我移到Postgres,它在我的服务容器中拥有SQLAlchemy数据库:

$ docker-compose -f docker-compose-dev.yml exec web-db psql -U postgres
$ \c web_dev 

如果我是

select * from tracks;

查询有效,并向我显示所有曲目。如果我:

select * from playlist_tracks;

它也可以工作:

 track_id | playlist_id 
----------+-------------
        1 |           1
        2 |           1
        3 |           1

如何像tracks一样从Postgres上的playlist对象获取并返回所有序列化的playlist.serialize()

0 个答案:

没有答案