Flask-admin, не отображающий столбцы "foreignkey"

class Parent(db.Model):
    id = db.Column(db.Integer, primary_key = True)
    name = db.Column(db.String(120))

    def __repr_(self):
        return '<Parent %r>' % (self.name)

admin.add_view(ModelView(Parent, db.session))


class Child(db.Model):
    id = db.Column(db.Integer, primary_key = True)
    name = db.Column(db.String(120))
    parent = db.Column(db.Integer, db.ForeignKey(Parent))

admin.add_view(ModelView(Child, db.session))

Привет -

Приведенный выше код является примером страницы флэшка-администратора, которую я пытаюсь создать. Цель состоит в том, чтобы на странице создания ребенка создать текстовое поле для имени и выпадающее меню, чтобы выбрать родителя.

В приведенной выше настройке есть только поле имени. Выпадающее поле родителя отсутствует.

Любые идеи, как это сделать?

Ответ 1

Как насчет того, измените ли вы класс Child на это:

class Child(db.Model):
    id = db.Column(db.Integer, primary_key = True)
    name = db.Column(db.String(120))
    parent_id = db.Column(db.Integer, db.ForeignKey('parent.id'))
    parent = db.relationship('Parent', backref=db.backref('children', lazy='dynamic'))

Я мало знаю об этом, и я не знаю, нужна ли вам обратная ссылка, но эта настройка работает для меня с Flask-Admin.

Ответ 2

Вероятно, вам нужно указать некоторые дополнительные опции для flask-admin через подкласс:

class ChildView(ModelView):
    column_display_pk = True # optional, but I like to see the IDs in the list
    column_hide_backrefs = False
    column_list = ('id', 'name', 'parent')


admin.add_view(ChildView(Parent, db.session))

Ответ 3

Это комплексное решение, которое не требует ручного обслуживания.

from sqlalchemy import inspect

class ChildView(ModelView):
    column_display_pk = True # optional, but I like to see the IDs in the list
    column_hide_backrefs = False
    column_list = [c_attr.key for c_attr in inspect(Child).mapper.column_attrs]


admin.add_view(ChildView(Child, db.session))

Ответ 4

Для чего бы это ни стоило, ни одно из перечисленных здесь решений не сработало для меня. Я столкнулся с проблемой, когда внешние ключи не отображались в Flask-Admin.

Это то, что помогло им появиться:

class CustomModelViewName(ModelView):
    can_delete = True
    column_hide_backrefs = False
    column_list = ["column_name", "column_name", "etc", "etc", "etc"]
    column_searchable_list = ["column_name"]