我目前正在与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:
LanguageLevel的DropDown:
对于一个“Candidat”,一种语言只能与一个LanguageLevel相关联。
我已经尝试了column_auto_select_related
,column_display_all_relations
,当然,没有一个像我想象的那样有效。当然这是我的错误。
如果有人能告诉我达到目标的正确方法,那将非常有帮助。
提前致谢。
此致
答案 0 :(得分:3)
最后,我在following post
中找到了我的解决方案我的错误是:
db.relationship
中加Candidat
(CandidatLanguage)
类。而不是那样,我把关系放在我的“数据透视”表中
(CandidatLanguage)。然后我的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))
有了它,一切正常,我有一个像我想要的内嵌形式。
我没有理解一切,但它有效。如果有人可以解释,那就是欢迎。
此致