У меня есть следующая таблица треков, цель которой - вернуть список «жанров».Однако в 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']
},
},