flask-admin не показывает столбцы внешнего ключа

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))

Привет -

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

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

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


person screenshot345    schedule 23.04.2013    source источник


Ответы (4)


Как насчет того, чтобы изменить класс 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.

person Jasmijn    schedule 24.04.2013
comment
Потрясающий! Я попробую сегодня вечером. Нужна ли мне какая-либо информация о первичном/вторичном соединении? Я получаю много ошибок по этому поводу. Надеюсь, ваше изменение будет работать потрясающе! - person screenshot345; 24.04.2013
comment
Честно говоря, я бы не знал. Я никогда не видел ничего о первичном/вторичном соединении с Flask-Alchemy или Flask-Admin. - person Jasmijn; 25.04.2013
comment
Причина, по которой это работает: Flask-Admin работает с объектами ORM, такими как модели, отношения и т. д. По умолчанию Flask-Admin будет игнорировать внешние ключи в моделях, поскольку они просто содержат некоторое число, а Flask-Admin хочет, чтобы конкретный объект ORM работал с ним. . Итак, когда у вас есть внешний ключ для модели, убедитесь, что вы не забыли связь уровня ORM между моделями - отношение. Flask-Admin будет использовать эту ссылку для отображения связанных моделей. И нет, вам не нужно делать причудливые вещи или добавлять обратные ссылки, чтобы заставить это работать. - person Joes; 26.04.2013

Вероятно, вам нужно указать некоторые дополнительные параметры для 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))
person Casey    schedule 25.04.2013
comment
Искал способ отображения ПК, отлично! - person Adversus; 25.04.2016

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

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))
person Will High    schedule 23.08.2019

Как бы то ни было, ни одно из перечисленных здесь решений не сработало для меня. Я столкнулся с проблемой, когда внешние ключи не отображались в 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"]
person Ali    schedule 25.09.2019