Python WTForms Alchemy QuerySelectField可以';t使用模型实例填充模型\u id字段

Python WTForms Alchemy QuerySelectField可以';t使用模型实例填充模型\u id字段,python,sqlalchemy,wtforms,Python,Sqlalchemy,Wtforms,我想要一个WTForms Alchemy表单来填充斗篷模型的模板id字段。但是,在调用populate\u obj时,我遇到了一个错误,SQLAlchemy无法适应Template。我认为我的关系建立得很好。为什么表单未正确设置所选模板 class Template(db.Model): id = db.Column(db.Integer, primary_key=True) cloaker = relationship('Cloaker', backref='cloaker')

我想要一个WTForms Alchemy表单来填充
斗篷
模型的
模板id
字段。但是,在调用
populate\u 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\u obj(斗篷)
给出以下错误:

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''}]
ProgrammingError:(psycopg2.ProgrammingError)无法调整类型“Template”[SQL:“插入到斗篷(状态、创建位置、更新位置、域、安全页面url、moneypage url、模板id、“用户”、公司、国家/地区、连接id、lp)值(%(状态)s、%(创建位置)s、%(更新位置)s、%(域)s、%(安全页面url)s、%(moneypage url)s、%(模板id)s、 %%(用户)s、%%(公司)s、%%(国家)s、%%(连接id)s、%%(lp)s)返回斗篷器.id'][参数:{'status':无,'domain':u'1','moneypage_url':u'asdv','template_id':,'country':u','created_at':datetime.datetime(2017,5,4,23,12,3,380155),'connection_id':u','updated_'datetime:datetime.datetime(2017,5,4,4,23,3,380167),'safepage_url':u'sdv','user':u'asdva','lp':u'','company':u'}]

您试图填充外键字段,
模板id
,而不是关系

QuerySelectField
按id选择实例,而不是按id。名称字段
template
。将您的关系backref修复为调用
模板
,因为
斗篷器.斗篷器
没有多大意义
populate_obj
将把
Dopper.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(...)