Flask 从SqlAlchemy\wtforms QuerySelectField获取id不是值

Flask 从SqlAlchemy\wtforms QuerySelectField获取id不是值,flask,sqlalchemy,flask-sqlalchemy,Flask,Sqlalchemy,Flask Sqlalchemy,我一直在尝试在两个表之间建立关系,并使用QuerySelectField从另一个表中选择一个字段,我已经成功地做到了这一点,但当我想要提交我一直获得的字段时,问题出现了: InterfaceError: <unprintable InterfaceError object> 解决了该问题,但如果选择空值,它将中断,因为空字段没有属性id 有人能建议怎么做吗 这是我的表格: from wtforms_alchemy import QuerySelectField, QuerySele

我一直在尝试在两个表之间建立关系,并使用QuerySelectField从另一个表中选择一个字段,我已经成功地做到了这一点,但当我想要提交我一直获得的字段时,问题出现了:

InterfaceError: <unprintable InterfaceError object>
解决了该问题,但如果选择空值,它将中断,因为空字段没有属性id

有人能建议怎么做吗

这是我的表格:

from wtforms_alchemy import QuerySelectField, QuerySelectMultipleField
from ....module1.authors.author.authorModel import Author
from flask_wtf import FlaskForm
from wtforms import SubmitField, HiddenField, BooleanField, SelectField, StringField, FileField, IntegerField, DateTimeField
from datetime import datetime
from wtforms.validators import DataRequired

def getAuthor():
    return Author.query

class PublicationsForm(FlaskForm):
    id = HiddenField()
    title = StringField('Title', validators=[DataRequired()])
    category = SelectField('Category', choices=[('', ''),('Journal', 'Journal'), ('Conference', 'Conference'), ('Talk', 'Talk'),('Talk2', 'Talk2'),('Talk3', 'Talk3')])
    year = DateTimeField('Year', format='%Y')
    publisher = BooleanField('Publisher')
    volume = IntegerField('Volume')
    issue = IntegerField('Issue')
    pages = StringField('Pages')
    location = StringField('Location')
    note = StringField('Note')
    fullCitation = FileField('FullCitation')
    fullSource = FileField('FullSource')
    finalVersion = FileField('FinalVersion')
    firstAuthor = QuerySelectField("FirstAuthor", query_factory=getAuthor, get_label="lastName", allow_blank=True, blank_text='')
    secondAuthor = QuerySelectField("SecondAuthor", query_factory=getAuthor, get_label="lastName", allow_blank=True, blank_text='')
    thirdAuthor = QuerySelectField("ThirdAuthor", query_factory=getAuthor, get_label="lastName", allow_blank=True, blank_text='')
    fourthAuthor = QuerySelectField("FourthAuthor", query_factory=getAuthor, get_label="lastName", allow_blank=True, blank_text='')
    fifthAuthor = QuerySelectField("FifthAuthor", query_factory=getAuthor, get_label="lastName", allow_blank=True, blank_text='')
    sixthAuthor = QuerySelectField("SixthAuthor", query_factory=getAuthor, get_label="lastName", allow_blank=True, blank_text='')
    submit = SubmitField("Save")
这是我的模型:

from sqlalchemy import Column, Integer, String, Boolean, DateTime
from app import db

class Publications(db.Model):
    id = db.Column(Integer, primary_key=True)
    title = db.Column(String, nullable=False)
    category = db.Column(String, nullable=False)
    year = db.Column(db.DateTime)
    publisher = db.Column(Boolean)
    volume = db.Column(Integer)
    issue = db.Column(String)
    pages = db.Column(String)
    location = db.Column(String)
    note = db.Column(String)
    fullCitation = db.Column(String)
    fullSource = db.Column(String)
    finalVersion = db.Column(String)
    issue = db.Column(db.Text)
    firstAuthor = db.Column(db.Integer, db.ForeignKey('author.id'))
    secondAuthor = db.Column(db.Integer, db.ForeignKey("author.id"),nullable=True )
    thirdAuthor = db.Column(db.Integer, db.ForeignKey("author.id"),nullable=True )
    fourthAuthor = db.Column(db.Integer, db.ForeignKey("author.id"),nullable=True )
    fifthAuthor = db.Column(db.Integer, db.ForeignKey("author.id"),nullable=True )
    sixthAuthor = db.Column(db.Integer, db.ForeignKey("author.id"),nullable=True )

    def __init__(self, title, category, year, publisher, volume, issue, pages, location, note, fullCitation, fullSource, finalVersion, firstAuthor, secondAuthor, thirdAuthor, fourthAuthor, fifthAuthor, sixthAuthor):
        self.title = title
        self.category = category
        self.year = year
        self.publisher = publisher
        self.volume = volume
        self.issue = issue
        self.pages = pages
        self.location = location
        self.note = note
        self.fullCitation = fullCitation
        self.fullSource = fullSource
        self.finalVersion = finalVersion
        self.firstAuthor = firstAuthor
        self.secondAuthor = secondAuthor
        self.thirdAuthor = thirdAuthor
        self.fourthAuthor = fourthAuthor
        self.fifthAuthor = fifthAuthor
        self.sixthAuthor = sixthAuthor

    def __repr__(self):
        return self.title
以下是我的看法:

from flask import render_template, request, flash, redirect, url_for
from . import publications_blueprint
from .publicationsForm import PublicationsForm
from .publicationsModel import Publications
from app import db

@publications_blueprint.route("/publications", methods=["GET", "POST"])
def createPublications():
    form = PublicationsForm(request.form)
    publicationss = Publications.query.all()
    if request.method == "POST" and form.validate_on_submit():
        publications = Publications(form.title.data, form.category.data, form.year.data, form.publisher.data, form.volume.data, form.issue.data, form.pages.data, form.location.data, form.note.data, form.fullCitation.data, form.fullSource.data, form.finalVersion.data, form.firstAuthor.data, form.secondAuthor.data, form.thirdAuthor.data, form.fourthAuthor.data, form.fifthAuthor.data, form.sixthAuthor.data)
        db.session.add(publications)
        db.session.commit()
        flash("Added Publications Successfully")
        return redirect(url_for("publications.createPublications"))
    return render_template("publications/publications.html", title="Publicationss", form=form, publicationss=publicationss)

@publications_blueprint.route("/updatePublications/<int:publications_id>", methods=["GET", "POST"])
def updatePublications(publications_id):
    publications = Publications.query.get(publications_id)
    form = PublicationsForm(request.form, obj=publications)
    if request.method == "POST" and form.validate_on_submit():
        publications.title = form.title.data
        publications.category = form.category.data
        publications.year = form.year.data
        publications.publisher = form.publisher.data
        publications.volume = form.volume.data
        publications.issue = form.issue.data
        publications.pages = form.pages.data
        publications.location = form.location.data
        publications.note = form.note.data
        publications.fullCitation = form.fullCitation.data
        publications.fullSource = form.fullSource.data
        publications.finalVersion = form.finalVersion.data
        publications.firstAuthor = form.firstAuthor.data
        publications.secondAuthor = form.secondAuthor.data
        publications.thirdAuthor = form.thirdAuthor.data
        publications.fourthAuthor = form.fourthAuthor.data
        publications.fifthAuthor = form.fifthAuthor.data
        publications.sixthAuthor = form.sixthAuthor.data
        db.session.commit()
        flash("Updated Publications Successfully")
        return redirect(url_for("publications.createPublications"))
    publicationss = Publications.query.all()
    return render_template("publications/publications.html", title="Publications", form=form, publicationss=publicationss)

@publications_blueprint.route("/deletePublications/<int:publications_id>", methods=["GET", "POST"])
def deletePublications(publications_id):
    publications = Publications.query.get(publications_id)
    db.session.delete(publications)
    db.session.commit()
    return redirect(url_for("publications.createPublications"))
从flask导入渲染模板、请求、闪存、重定向、url
从…起导入出版物和蓝图
from.publicationsForm导入发布sform
from.Publications模型导入出版物
从应用程序导入数据库
@publications\u blueprint.route(“/publications”,方法=[“GET”,“POST”])
def createPublications():
表单=PublicationsForm(request.form)
publicationss=Publications.query.all()
如果request.method==“POST”和form.validate\u on\u submit():
出版物=出版物(form.title.data、form.category.data、form.year.data、form.volume.data、form.issue.data、form.pages.data、form.location.data、form.note.data、form.fullSource.data、form.finalVersion.data、form.firstAuthor.data、form.thirdAuthor.data、form.FortAuthor.data、form.FiftAuthor.data、,表6(作者数据)
db.session.add(发布)
db.session.commit()
flash(“成功添加出版物”)
返回重定向(url_用于(“publications.createPublications”))
返回呈现模板(“publications/publications.html”,title=“Publicationss”,form=form,Publicationss=Publicationss)
@publications_blueprint.route(“/updatePublications/”,methods=[“GET”,“POST”])
def更新发布(发布\u id):
publications=publications.query.get(publications\u id)
表单=出版物表单(request.form,obj=出版物)
如果request.method==“POST”和form.validate\u on\u submit():
publications.title=form.title.data
publications.category=form.category.data
publications.year=form.year.data
publications.publisher=form.publisher.data
publications.volume=form.volume.data
publications.issue=form.issue.data
publications.pages=form.pages.data
publications.location=form.location.data
publications.note=form.note.data
publications.full引文=form.full引文.data
publications.fullSource=form.fullSource.data
publications.finalVersion=form.finalVersion.data
publications.firstAuthor=form.firstAuthor.data
publications.secondAuthor=form.secondAuthor.data
publications.thirdautor=form.thirdautor.data
publications.fourthauther=form.fourthauther.data
publications.fifthauther=form.fifthauther.data
publications.sixthauther=form.sixthauther.data
db.session.commit()
flash(“成功更新出版物”)
返回重定向(url_用于(“publications.createPublications”))
publicationss=Publications.query.all()
返回呈现模板(“publications/publications.html”,title=“publications”,form=form,publicationss=publicationss)
@publications\u blueprint.route(“/deletePublications/”,方法=[“GET”,“POST”])
def删除出版物(出版物id):
publications=publications.query.get(publications\u id)
db.session.delete(发布)
db.session.commit()
返回重定向(url_用于(“publications.createPublications”))

在类似的情况下,我还在模型中使用
allow\u blank=True
作为QuerySelectField搜索目标。我手动检查视图中是否选择了某些内容:

if formfilter.search_target.data:
   search_target = formfilter.search_target.data.id
else:                  
   ....

在我发现这将有助于获得所需结果之前,我已经这样做了:publications=publications(title=form.title.data,category=form.category.data…)
if formfilter.search_target.data:
   search_target = formfilter.search_target.data.id
else:                  
   ....