Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/293.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 烧瓶-烧瓶管理-一对多-级联_Python_Flask_Flask Sqlalchemy_Flask Wtforms_Flask Admin - Fatal编程技术网

Python 烧瓶-烧瓶管理-一对多-级联

Python 烧瓶-烧瓶管理-一对多-级联,python,flask,flask-sqlalchemy,flask-wtforms,flask-admin,Python,Flask,Flask Sqlalchemy,Flask Wtforms,Flask Admin,我目前正在用Flask启动一个项目。我目前正在经历一次烧瓶管理 我尝试建立一个两级关系。对于每一个“候选人”,我喜欢将一种语言与该语言的级别(LanguageLevel)联系起来 这是我的模特 from app import db class Candidat(db.Model): id = db.Column(db.Integer, primary_key=True) firstname = db.Column(db.String(128)) lastname = d

我目前正在用Flask启动一个项目。我目前正在经历一次烧瓶管理

我尝试建立一个两级关系。对于每一个“候选人”,我喜欢将一种语言与该语言的级别(LanguageLevel)联系起来

这是我的模特

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'))
我想要的是一份如下所示的候选表格:

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")
名字:\uuuuuuuuuuu

姓氏:\uuuuuuuuuuuuuu

语言:

  • 语言下拉列表:

    • 语言1
    • 语言2
  • LanguageLevel的下拉列表:

    • 一级
    • 二级
对于一个“候选人”,一种语言只能与一种语言级别相关联

我试过
列自动选择相关的
列显示所有关系
,当然没有一个像我想的那样工作。当然这是我的错误

如果有人能告诉我实现目标的正确方法,那将非常有帮助

提前谢谢


关于

最后,我在

我的错误是:

  • db.relationship
    (CandidateLanguage)放入我的
    Candidate
    班级。相反,我将关系放在“透视”表中 (候选语言)
  • 正如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")
这样,一切都很好,我有了一个我想要的内联表单

我不是什么都懂,但它很管用。如果有人能解释,那就太好了

问候

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))