Как отфильтровать и отобразить flask sqlalchemy данные отношения один ко многим с помощью jinja - PullRequest
0 голосов
/ 19 января 2020

У меня есть две таблицы mysql ("song_info" и "djartist1"), с которыми они имеют отношение один ко многим. Я хочу отобразить все песни от одного исполнителя (все сообщения от определенного пользователя c). Но я получаю список, вместо того, что я хочу отображать в файле html. Можете ли вы дать мне решение, пожалуйста?.

Вот коды, связанные с этой проблемой

#Parent
class Djartist1(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    artistid = db.Column(db.Integer, nullable=False)
    name = db.Column(db.String(30), nullable=False)
    slug = db.Column(db.String(30), nullable=False)
    dj_img_location = db.Column(db.String(250), nullable=True)
    facebook = db.Column(db.String(200), nullable=True)
    email = db.Column(db.String(50), nullable=True)
    song_info = db.relationship('Song_info', backref='djartist1', lazy=True)


#Child
class Song_info(db.Model):
    song_id = db.Column(db.Integer, primary_key=True)
    title = db.Column(db.String(60), nullable=False)
    slug = db.Column(db.String(50), nullable=False)
    artist = db.Column(db.String(60), nullable=True)
    djartist = db.Column(db.String(20), nullable=True)
    owner_id = db.Column(db.Integer, db.ForeignKey('djartist1.id'), nullable=False)
    file_location_name = db.Column(db.String(250), nullable=False)
    img_location_name = db.Column(db.String(250), nullable=False)
    lyrics = db.Column(db.String(400), nullable=True)
    dateadded = db.Column(db.String, nullable=False)


@app.route("/dj-artists/<string:dj_slug>.html", methods=['GET'])
def dj_artist(dj_slug):
    artists2 = Djartist1.query.filter_by(slug=dj_slug).first()
    songs = Djartist1.query.filter_by(slug=dj_slug).all()
    return render_template('dj-artist.html', paramiter=paramiter, info=artists2, songs=songs)

Это html код

<!DOCTYPE html>
<html>
<head>
  <title></title>
</head>
<body>
<h1>Hello</h1>
songs {{songs}}
<br>
<p>forloop for songs</p>
    {% for song in songs %}
      <li>{{ song.song_info }}</li>  
    {% endfor %}

</body>
</html>

Это вывод html, который я получаю

Hello
songs [<Djartist1 3>]

forloop for songs
[<Song_info 4>, <Song_info 5>, <Song_info 6>, <Song_info 7>, <Song_info 8>, <Song_info 9>, <Song_info 10>, <Song_info 11>, <Song_info 12>]

Выше цифры верны. Но что мне нужно, так это название песни этих чисел (ID).

Jinja2 HTML код и вывод

1 Ответ

0 голосов
/ 19 января 2020

Вам нужно указать, какие атрибуты вы хотите видеть, в данный момент вы ссылаетесь на весь объект, а не на строку или целое число, и это также то, что представляется.

<!DOCTYPE html>
<html>
<head>
  <title></title>
</head>
<body>
<h1>Hello</h1>
songs {{songs}}
<br>
<p>forloop for songs</p>
    {% for song in songs %}
      <li>{{ song.song_info.title }}</li>  
    {% endfor %}

</body>
</html>

Есть несколько больше примечаний, чтобы дать по этому вопросу:

Являются ли слизни художника уникальными? Потому что, похоже, у вас есть несколько исполнителей с одинаковым слагом, и у каждого исполнителя есть одна песня. Было бы более разумно иметь одну песню с отношениями artist_id и artist, а затем дать исполнителю атрибут songs. Вот пример:

class Customer:
    id = Column(BigInteger, primary_key=True)
    orders = relationship("Order", back_populates="customer")

class Order:
    customer_id = Column(Integer, ForeignKey('customer.id'), nullable=False)
    customer = relationship("Customer", innerjoin=True, back_populates="orders")

Кроме того, если у вас есть только один Djartist на слаг, то вам не нужно делать несколько запросов. Вы можете изменить функцию просмотра на

@app.route("/dj-artists/<string:dj_slug>.html", methods=['GET'])
def dj_artist(dj_slug):
    artist = Djartist1.query.filter_by(slug=dj_slug).one()
    return render_template('dj-artist.html', info=artist)

и ссылочные песни в шаблоне через {% for song in artist.songs} %}

...