编程语言
首页 > 编程语言> > python – Flask – Flask-Admin – One-To-Many – Cascade

python – Flask – Flask-Admin – One-To-Many – Cascade

作者:互联网

我目前正在与Flask一起开展一个项目.我目前正在体验Flask-Admin.

我尝试建立2级关系.对于每个“Candidat”,我喜欢将语言和语言(LanguageLevel)关联起来.

这是我的models.py

from app import db

class Candidat(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    firstname = db.Column(db.String(128))
    lastname = db.Column(db.String(128))
    birthdate = db.Column(db.DateTime)
    languages = db.relationship("CandidatLanguage", backref="candidat")

    def __repr__(self):
        return '<Nom %r>' % self.lastname


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

    def __repr__(self):
        return '<Langues %r>' % self.name

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

    def __repr__(self):
        return '<Niveau : %r>' % self.name

class CandidatLanguage(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    candidat_id = db.Column(db.Integer, db.ForeignKey('candidat.id'))
    language_id = db.Column(db.Integer, db.ForeignKey('language.id'))
    langguage_level_id = db.Column(db.Integer, db.ForeignKey('languagelevel.id'))

这是我的views.py

from models import Candidat, Languagelevel, Language, CandidatLanguage

from flask.ext.admin import Admin, BaseView, expose
class MyView(BaseView):
    @expose('/')
    def index(self):
        return self.render('adm-index.html')

admin = Admin(app)
admin.add_view(MyView(name='Hello'))

from flask.ext.admin.contrib.sqla import ModelView

admin.add_view(ModelView(Candidat, db.session))
admin.add_view(ModelView(CandidatLanguage, db.session))
admin.add_view(ModelView(Language, db.session))
admin.add_view(ModelView(Languagelevel, db.session))

我想要的是Candidat表格,如下所示:

名字 : ____

姓 : _____

语言 :

> DropDown for Language:

>语言1
>语言2

> LanguageLevel的DropDown:

> 1级
> 2级

对于一个“Candidat”,一种语言只能与一个LanguageLevel相关联.

我已经尝试过column_auto_select_related,column_display_all_relations,当然它们都没有像我想的那样工作.当然这是我的错.

如果有人能告诉我达到目标的正确方法,那将非常有帮助.

提前致谢.

问候

解决方法:

最后,我在following post中找到了我的解决方案

我的错误是:

>在我的Candidat中放入db.relationship(CandidatLanguage)
类.而不是那样,我把关系放在我的“数据透视”表中
(CandidatLanguage).
>正如IfLoop在帖子中所说,我必须“从平原转换
与“关联对象”的多对多关系.我不喜欢
理解为什么但它使用Association对象.

然后我的models.py现在看起来像这样:

class Candidat(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    firstname = db.Column(db.String(128))
    lastname = db.Column(db.String(128))
    birthdate = db.Column(db.Date)
    categories = db.relationship('Category', secondary=category_candidat,
                                 backref=db.backref('candidat', lazy='dynamic'))

    def __repr__(self):
        return '<Nom %r>' % self.lastname


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

    def __repr__(self):
        return '%s' % unicode(self.name)


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

    def __repr__(self):
        return '%s' % self.name

class CandidatLanguage(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    candidat_id = db.Column(db.Integer, db.ForeignKey('candidat.id'))
    language_id = db.Column(db.Integer, db.ForeignKey('language.id'))
    language_level_id = db.Column(db.Integer, db.ForeignKey('languagelevel.id'))

    language = db.relationship(Language, backref="Candidat")
    candidat = db.relationship(Candidat, backref="Langue")
    languagelevel = db.relationship(Languagelevel, backref="Candidat")

我的views.py是这样的:

from flask.ext.admin import Admin, BaseView, expose
class MyView(BaseView):
    @expose('/')
    def index(self):
        return self.render('adm-index.html')

admin = Admin(app)
admin.add_view(MyView(name='Hello'))

from flask.ext.admin.contrib.sqla import ModelView

class CandidatView(ModelView):
    column_auto_select_related = True
    inline_models = (CandidatLanguage,)

admin.add_view(CandidatView(Candidat, db.session))
admin.add_view(ModelView(Language, db.session))
admin.add_view(ModelView(Languagelevel, db.session))

有了它,一切正常,我有一个像我想要的内嵌形式.

我没有理解一切,但它有效.如果有人可以解释,那就是欢迎.

问候

标签:python,flask,flask-sqlalchemy,flask-wtforms,flask-admin
来源: https://codeday.me/bug/20190629/1322933.html