python - Flask - Flask-Admin - 一对多 - 级联

标签 python flask flask-sqlalchemy flask-wtforms flask-admin

我目前正在使用 Flask 开始一个项目。我目前正在体验 Flask-Admin。

我尝试建立一个 2 级关系。对于每个“Candidat”,我喜欢将一种语言和该语言的级别 (LanguageLevel) 相关联。

这是我的模型.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))

我想要的是一个看起来像这样的候选人表格:

名字:____

姓氏:_____

语言:

  • 语言下拉列表:

    • 语言 1
    • 第二语言
  • 语言级别的下拉菜单:

    • 一级
    • 2 级

对于一个“Candidat”,一种语言只能与一个语言级别相关联。

我已经尝试过 column_auto_select_relatedcolumn_display_all_relations,当然它们都不像我想的那样工作。当然这是我的错误。

如果有人能告诉我实现目标的正确方法,那将非常有帮助。

提前致谢。

问候

最佳答案

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

我的错误是:

  • 在我的 Candidat 中放置一个 db.relationship (CandidatLanguage) 类(class)。取而代之的是,我将关系放在我的“数据透视表”中 (候选语言)。
  • 正如 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-Admin - 一对多 - 级联,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21968176/

相关文章:

python - 在 Python 中对生成器进行索引和切片

python - 如何从numpy中的D数组创建D维坐标数组

python - 为类型化内存 View 分配内存的推荐方法是什么?

Python 解析奇怪的 XML?

python - 如何杀死由 python os.system() 创建的进程

python-3.x - 无法使用SQLAlchemy连接到MYSQL

python - flask.ext.restful -> reqparse

python - 渲染存储在 FTP 服务器上的 Jinja 模板

python - sqlalchemy 查询持续时间日志记录

python-3.x - 在 Flask SQLAlchemy 中插入新值之前,如何强制检查外键?