2017-05-04 1 views
2

Cloakerモデルのtemplate_idフィールドにWTForms-Alchemyフォームを設定します。しかし、populate_objを呼び出すときにSQLAlchemyがTemplateに適応できないというエラーが発生します。私の関係は正しく設定されていると思います。選択したテンプレートが正しく設定されていないのはなぜですか?WTForms-Alchemy QuerySelectFieldでmodel_idフィールドにModelインスタンスを設定できません

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''}] 

答えて

0

あなたが外部キーフィールド、template_id、ない関係を投入しようとしています。

QuerySelectFieldは、idではなくidでインスタンスを選択します。フィールド名をtemplateとします。 Cloaker.cloakerが意味をなさないので、templateと呼ばれる関係のバックレックスを修正してください。 populate_objCloaker.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(...) 
+0

返信ありがとうございます。私はまだこのエラーが発生しています:https://gist.github.com/vincentwhales/390993779c994bb6d5dcd98db5c1a1f0私は手動でtemplate_idフィールドをPOSTで検証後に自分で割り当てなければなりませんか? – Sparrowcide

+0

それは無関係の問題です。フィールドはnullにはできませんが、printステートメントに従って、テンプレートを選択しなかったので、Noneです。テンプレートを選択するか、フィールドを非オプションにします。あなたが質問で尋ねた問題は修正されています: 'populate_obj'は何も選択しなかったので' cloaker.template = None'を正しく設定しました。 – davidism

関連する問題