SQLAlchemy - возвращать сериализованные значения обратных ссылок на Postgres - PullRequest
0 голосов
/ 03 мая 2019

У меня есть 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 из моего playlist объекта на Postgres, как в playlist.serialize() * * 1045

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...