Как сериализовать данные в виде списка в FlaskSQLAlchemy? - PullRequest
0 голосов
/ 18 июня 2019

У меня есть следующая таблица треков, цель которой - вернуть список «жанров».Однако в SQAlchemy нет типа данных списка, поэтому я объявляю «жанры» как string:

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

    id = db.Column(db.Integer, primary_key=True)
    created = db.Column(db.DateTime, default=func.now())
    title = db.Column(db.String(250))
    artist = db.Column(db.String(250))
    genre = db.Column(db.String(250))

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

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

    def serialize(self):
       return {
           'id' : self.id,
           'title': self.title,
           'artist': self.artist,
           'created': self.created.isoformat(),
           'genre': self.genre,
       }

Существует взаимосвязь между треком и другим столом, «Плейлистом», например:

class Playlist(db.Model):

    __tablename__ = 'playlist'

    id = db.Column(db.Integer, primary_key=True)
    title = db.Column(db.String(50))
    artist = db.Column(db.String(50)) # we always need one for tagging purposes
    created = db.Column(db.DateTime, default=func.now())

    user_id = db.Column(db.Integer, db.ForeignKey('users.id'))
    menu_id = db.Column(db.Integer, db.ForeignKey('menu.id'))
    consumer_id = db.Column(db.Integer, db.ForeignKey('consumer.id'))

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

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

    def serialize(self):
       return {
           'id' : self.id,
           'created' : self.created.isoformat(),
           'title': self.title,
           'artist': self.artist,
           '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.append(track) и print (playlist.serialize()), я получу следующий сериализованный объект:

  -playlists: [
            {
              id: 1,
              created: "2019-06-17T23:04:35.019444",
              title: "myplaylist",
            - tracks: [
                 - {
                     id: 17,
                     title: "Bryter Layter",
                     artist: "Nick Drake",
                     created: "2019-06-17T20:12:57.766740",
                     genre: "['art rock', 'british folk', 'chamber pop', 
                             'folk', 'folk rock', 'folk-pop', 'freak folk', 
                             'indie folk', 'indie pop', 'indie rock', 
                             'melancholia', 'rock', 'singer-songwriter', 'slow 
                             core', 'traditional folk']"
                   },
              }, 

Вышеработает, но Мне нужен список, а не строка для моего ответа RESTFul , и я узнал, что, возможно, лучшим решением является создание еще одного столбца для «жанров» (который представляет собой список строк в любом случае), и поэтому я сделал это:

class Genre(db.Model):

    __tablename__ = 'genre'

    id = db.Column(db.Integer, primary_key=True)
    genre = db.Column(db.String(50))
    title = db.Column(db.String(50))
    artist = db.Column(db.String(50))

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

    def serialize(self):
       return {
           'id' : self.id,
           'created' : self.created.isoformat(),
           'title': self.title,
           'artist': self.artist,
           'genre': self.genre
       }

ВОПРОС:

Теперь, как я могу связать все 3 таблицы выше, 'Track', 'Playlist' и 'Genre', чтобы запросить playlist.serialized() и заставить мой API ответить genres правильно serialized(), как список, например?

     -playlists: [
            {
              id: 1,
              created: "2019-06-17T23:04:35.019444",
              title: "myplaylist",
            - tracks: [
                 - {
                     id: 17,
                     title: "Bryter Layter",
                     artist: "Nick Drake",
                     created: "2019-06-17T20:12:57.766740",
                     genre: ['art rock', 'british folk', 'chamber pop', 
                             'folk', 'folk rock', 'folk-pop', 'freak folk', 
                             'indie folk', 'indie pop', 'indie rock', 
                             'melancholia', 'rock', 'singer-songwriter', 'slow 
                             core', 'traditional folk']
                   },
              }, 
...