2014-02-20 3 views
1

flask-admin Пометки db.relationship полей model views, если требуется, поэтому нет возможности добавить запись, если таблица, к которой идет связь, пуста.flask-admin налагает обязательный атрибут на отношения

Пример:

class Type(db.Model): 
    id   = db.Column(db.Integer, primary_key=True) 
    name   = db.Column(db.String(50), nullable=False, unique=True, index=True) 
    area_id  = db.Column(db.Integer, db.ForeignKey("area.id", onupdate='CASCADE', ondelete='CASCADE'), nullable=False, index=True) 
    description = db.Column(db.Text) 

class Area(db.Model): 
    id   = db.Column(db.Integer, primary_key=True) 
    name   = db.Column(db.String(50), nullable=False, unique=True, index=True) 
    description = db.Column(db.Text) 
    types = db.relationship('Type', backref='Area', lazy='dynamic', cascade='all, delete-orphan') 

типа поля требуется при создании зоны записи через опоку-администратор, но если типа таблица пуста, нет никакого способа, чтобы добавить какую-либо информации в база данных. flask-admin не позволит ничего добавить в таблицу Area из-за backref, чтобы напечатать таблицу, которая делает нужное поле, но в таблице Type еще ничего нет. flask-admin не позволит ничего добавить в таблицу Area, так как поле типа требуется на странице.

Я ничего не мог найти по этому вопросу. Есть несколько тем, обсуждающих обходные пути для отношений «многие ко многим», но это самые простые отношения «один ко многим», которые, как я понимаю, должны просто работать из коробки.

Я понял, что если я добавлю Type в inline_models под моделью Area, тогда я открою кнопку «Добавить типы» на странице создания области, но если сам inline_model имеет отношение, это тоже не помогло бы, из-за по той же причине.

class ModelViewArea(ModelView): 
    inline_models = (models.Type,) 

admin.add_view(ModelViewProductArea (models.Area, db.session, name="Area", category='Product')) 
admin.add_view(ModelViewProductType (models.Type, db.session, name="Type", category='Product')) 

ответ

0

Оказалось, что если внешний ключ, связанный с отношениями имеет обнуляемым = False затем колба-админ отмечает поле, как требуется в колба-WTF. Как только я удалил nullable = False из атрибутов внешнего ключа Тип класс, flask-admin прекратил показывать поле, как требуется, как в режиме просмотра модели модели, так и в режиме Area model.

Однако, поскольку я удалил nullable = False, больше не было причин для ondelete = "CASCADE" и каскадного поведения при отношениях. Default cascade подходит подходит. Окончательный код выглядит так:

class Type(db.Model): 
    id   = db.Column(db.Integer, primary_key=True) 
    name   = db.Column(db.String(50), nullable=False, unique=True, index=True) 
    area_id  = db.Column(db.Integer, db.ForeignKey("area.id", onupdate='CASCADE', ondelete='SET NULL'), index=True) 
    description = db.Column(db.Text) 

class Area(db.Model): 
    id   = db.Column(db.Integer, primary_key=True) 
    name   = db.Column(db.String(50), nullable=False, unique=True, index=True) 
    description = db.Column(db.Text) 
    types = db.relationship('Type', backref='Area', lazy='dynamic') 
0

Эта проблема исправлена ​​в git-master. Flask-Admin 1.0.7 уже несколько месяцев, и с тех пор git-версия накопила немало изменений.

Ответ Сергея об удалении nullable=False с внешнего ключа изменяет семантику и, следовательно, является обходным путем. С помощью Flask-Admin от ведущего можно оставить nullable=False.

 Смежные вопросы

  • Нет связанных вопросов^_^