Колба-Колба-Админ - Один-Ко-Многим-Каскад


В настоящее время я начинаю проект с 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 4

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.

С уважением