Как мне создать Flask-AppBulider ModelView, который перечисляет объединенный вывод из двух таблиц? - PullRequest
0 голосов
/ 11 ноября 2019

Я новичок в Flask-AppBulider и SqlAlchecmy, и пытаюсь написать плагин пользовательского интерфейса для Apache Airflow, на котором запущен flask-appbuilder. Здесь представлены две модели, представляющие две таблицы: SoundTrack (exp_track) и Album (exp_album). SongsModelView - это ModelView с

datamodel = SQLAInterface(SoundTrack)

Фрагмент кода включает три определения классов в трех разных файлах.

Таблицы создаются в базе данных просто отлично. Фрагмент кода также включает определения таблиц из БД (sqlite здесь). Колонки от SoundTrack Модель показываются нормально. Но все столбцы, которые нужно извлечь из внешнего ключа, отображаются как пустые.

После некоторого чтения я попытался определить relationship в модели альбома с lazy = joined, но столбец exp_album.title по-прежнемузагружается пустой.

exp_track.py

from airflow.models.base import Base
from airflow.utils.log.logging_mixin import LoggingMixin
from airflow import settings

from sqlalchemy import Column, Integer, String, ForeignKey

class SoundTrack(Base, LoggingMixin):
    __tablename__ = "exp_track"

    id = Column(Integer, primary_key=True, autoincrement=True)
    title = Column(String(256), nullable=False)
    album_id = Column(Integer, ForeignKey("exp_album.id"), nullable=False)

    __table_args__ = (
        {'extend_existing': True}
    )


SoundTrack.__table__.create(settings.engine, checkfirst=True)

exp_album.py

from airflow.models.base import Base
from airflow.utils.log.logging_mixin import LoggingMixin
from airflow import settings

from sqlalchemy import Column, Integer, String
from sqlalchemy.orm import relationship

class Album(Base, LoggingMixin):
    __tablename__ = "exp_album"

    id = Column(Integer, primary_key=True, autoincrement=True)
    title = Column(String(256), nullable=False)
    artist = Column(String(256), nullable=False)

    tracks = relationship("my_songs_plugin.model.exp_track.SoundTrack", backref='track', lazy="joined")

    __table_args__ = (
        {'extend_existing': True}
    )


Album.__table__.create(settings.engine, checkfirst=True)

exp_song_view.py

from flask_appbuilder import ModelView
from flask_appbuilder.models.sqla.interface import SQLAInterface

from airflow.www_rbac.widgets import AirflowModelListWidget

from my_songs_plugin.model.exp_track import SoundTrack


class SongsModelView(ModelView):
    list_widget = AirflowModelListWidget
    page_size = 100

    route_base = '/songs'

    datamodel = SQLAInterface(SoundTrack)

    base_permissions = ['can_list']

    list_columns = ['id', 'title', 'album_id', 'exp_album.title']


songs_view = SongsModelView()
songs_view_data = {"category": "My Songs Plugin",
                      "name": "Songs",
                      "view": songs_view}

Определения таблиц:

CREATE TABLE exp_track (
    id INTEGER NOT NULL, 
    title VARCHAR(256) NOT NULL, 
    album_id INTEGER NOT NULL, 
    PRIMARY KEY (id), 
    FOREIGN KEY(album_id) REFERENCES exp_album (id)
);


CREATE TABLE exp_album (
    id INTEGER NOT NULL, 
    title VARCHAR(256) NOT NULL, 
    artist VARCHAR(256) NOT NULL, 
    PRIMARY KEY (id)
);

Я не могу понять, как отобразить объединенный список.

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