Я новичок в 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)
);
Я не могу понять, как отобразить объединенный список.