【问题标题】:Flask - Flask-Admin - One-To-Many - CascadeFlask - Flask-Admin - 一对多 - 级联
【发布时间】:2014-03-24 23:01:45
【问题描述】:

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

我尝试建立一个 2 级关系。对于每个“候选人”,我喜欢将一种语言和该语言的级别 (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'))

这是我的意见.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
  • 语言级别的下拉菜单:

    • 1 级
    • 2 级

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

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

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

提前致谢。

问候

【问题讨论】:

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


    【解决方案1】:

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

    我的错误是:

    • 在我的Candidat 中添加db.relationship (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))
    

    这样,一切正常,我有一个我想要的内联表单。

    我没有理解所有内容,但它确实有效。如果有人能解释一下,那当然是欢迎的。

    问候

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-02-20
      • 2012-08-02
      • 2022-01-18
      • 1970-01-01
      • 1970-01-01
      • 2017-05-28
      • 2022-11-05
      • 1970-01-01
      相关资源
      最近更新 更多