Колба-Колба-Админ - Один-Ко-Многим-Каскад
В настоящее время я начинаю проект с Flask. Сейчас я испытываю фляжку-админ.
Я пытаюсь установить 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'))
Вот мой 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
-
Выпадающее меню для уровня LanguageLevel:
- Уровень 1
- Уровень 2
Для одного "кандидата" один язык может быть связан только с одним языковым уровнем.
Я пытался.column_auto_select_related
, column_display_all_relations
, и конечно ни один из них не работает так как я мысль. Конечно, это моя ошибка.
Заранее благодарю.
С уважением
1 ответ:
Наконец, я нашел свое решение в следующем посте
Мои ошибки были:
- положить
db.relationship
(CandidatLanguage) в мойCandidat
класс. Вместо этого я поместил отношения в свою "сводную" таблицу (Кандидатский язык).- как сказал Ифлуп в посте, я должен " переключиться с равнины отношение "многие ко многим" к "объекту Ассоциации". Я не ... понятно, почему, но это работает с использованием объекта Ассоциации.
Тогда мой 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))
С этим все работает нормально, и у меня есть встроенная форма, как я хочу.
Я не все понял, но это работает. если кто-то может объяснить, то это добро пожаловать в coruse.
С уважением