【问题标题】:WTForms-Alchemy QuerySelectField can't populate model_id field with Model instanceWTForms-Alchemy QuerySelectField 无法使用 Model 实例填充 model_id 字段
【发布时间】:2017-05-04 15:18:48
【问题描述】:

我想要一个 WTForms-Alchemy 表单来填充 Cloaker 模型的 template_id 字段。但是,当调用populate_obj 时,我收到一个错误,SQLAlchemy 无法适应Template。我认为我的关系设置正确。为什么表单没有正确设置所选模板?

class Template(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    cloaker = relationship('Cloaker', backref='cloaker')

class Cloaker(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    template_id = db.Column(db.Integer, db.ForeignKey('template.id'), nullable=False)

class CloakerForm(ModelForm):
    class Meta:
        model = Cloaker

    template_id = QuerySelectField(
        query_factory=lambda: Template.query.all(),
        get_pk=lambda a: a.id,
        get_label=lambda a: a.name,
        allow_blank=True,
        blank_text=u'-- please choose --'
    )

form.populate_obj(cloaker) 给出以下错误:

ProgrammingError: (psycopg2.ProgrammingError) can't adapt type 'Template' [SQL: 'INSERT INTO cloaker (status, created_at, updated_at, domain, safepage_url, moneypage_url, template_id, "user", company, country, connection_id, lp) VALUES (%(status)s, %(created_at)s, %(updated_at)s, %(domain)s, %(safepage_url)s, %(moneypage_url)s, %(template_id)s, %(user)s, %(company)s, %(country)s, %(connection_id)s, %(lp)s) RETURNING cloaker.id'] [parameters: {'status': None, 'domain': u'1', 'moneypage_url': u'asdv', 'template_id': <automata.cloaker.models.Template object at 0x10fd87990>, 'country': u'', 'created_at': datetime.datetime(2017, 5, 4, 23, 12, 3, 380155), 'connection_id': u'', 'updated_at': datetime.datetime(2017, 5, 4, 23, 12, 3, 380167), 'safepage_url': u'sdv', 'user': u'asdva', 'lp': u'', 'company': u''}]

【问题讨论】:

    标签: python sqlalchemy wtforms


    【解决方案1】:

    您正在尝试填充外键字段template_id,而不是关系。

    QuerySelectField 通过 id 而不是 id 选择实例。将您的字段命名为 template。修复你的关系 backref 被称为template,因为Cloaker.cloaker 没有多大意义。 populate_obj 会将Cloaker.template 关系设置为选定的Template,SQLAlchemy 将正确处理。

    class Template(db.Model):
        id = db.Column(db.Integer, primary_key=True)
    
    class Cloaker(db.Model):
        id = db.Column(db.Integer, primary_key=True)
        template_id = db.Column(db.ForeignKey(Template.id), nullable=False)
        template = db.relationship(Template)
    
    class CloakerForm(ModelForm):
        template = QuerySelectField(...)
    

    【讨论】:

      猜你喜欢
      • 2019-01-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多