2014-02-23 84 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