2014-02-23 99 views
4

我目前正在启动一个烧瓶项目。我目前正在经历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形式至极看起来是这样的:

姓:_ __ _

名字:_ __ _ _

语言:

  • 下拉为语言:

    • 语言1
    • 语言2
    • 为语言级
  • 下拉:

    • 级别1
    • 级别2

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

我试过column_auto_select_relatedcolumn_display_all_relations,当然他们都没有像我想的那样工作。当然,这是我的错误。

如果有人能为我展示实现我的目标的正确方法,那将非常有用。

在此先感谢。

问候

回答

3

最后,我发现我在following post

我的错误解决方案是:

  • 把一个db.relationship(CandidatLanguage)在我Candidat 类。相反,我把关系放在我的“数据透视表” (CandidatLanguage)中。
  • 作为IfLoop在帖子中说,我一定要关联对象。‘我不' 明白为什么,但它的工作原理使用关联对象。
“从普通 许多一对多关系的开关’

然后我的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)) 

随着那样,一切正常,我有一个像我想要的内联表单。

我还没有理解一切,但它的工作原理。如果有人能解释,这是非常受欢迎的。

Regards