【问题标题】:Flask-SQLAlchemy adds unnecessary row in parents table (relational tables)Flask-SQLAlchemy 在父表(关系表)中添加不必要的行
【发布时间】:2016-12-13 12:55:45
【问题描述】:

我最近正在尝试使用 Flask 构建一个小型网络应用程序。对于数据库“东西”,我使用 Flask-SQLAlchemy,现在我正在尝试建立两个对象之间的关系。
我有一个“项目”表和一个“文件”表,它应该是一对多的关系,所以 x 文件可以与一个项目相关联(实际上,当我想通后,将来会有更多的关系当前问题已解决)。
我制作了一个输入掩码模板,因此用户可以上传文件并通过下拉列表将其链接到项目,该下拉列表中填充了存储在其表中的现有项目。这就是对应的视图:

@app.route('/admin/upload/', methods=('GET', 'POST'))
def upload():
form = forms.UploadForm()

if not os.path.isdir(app.config['UPLOAD_FOLDER']):
    os.mkdir(app.config['UPLOAD_FOLDER'])
    print('Folder created')  

form.projectId.choices = []

for g in models.Project.query.order_by('name'):
    form.projectId.choices.append((g.id, g.name))

if form.validate_on_submit():
    filename = secure_filename(form.fileUpload.data.filename)
    filepath = os.path.join(app.config['UPLOAD_FOLDER'], filename)
    assocProject = models.Project(name=models.Project.query.filter_by(id=form.projectId.data).first().name)

    form.fileUpload.data.save(filepath)
    prepedFile = models.File(path=filepath, project=assocProject)

    print(prepedFile)
    print(form.projectId.data)

    db.session.add(prepedFile)
    db.session.commit()

    return 'success'
else:
    filename = None
return render_template('upload.html', form=form, filename=filename) 

准备好的文件应该是文件类的一个实例,它具有链接的项目实例作为属性,因此提交应该可以工作。

    class Project(db.Model):
__tablename__ = 'project'

id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(64))
file = db.relationship('File', backref="projects")
post = db.relationship('Post', backref="projects")

def __init__(self, name):
    self.name = name

def __repr__(self):
    return '<Project %r>' % self.name


class File(db.Model):
__tablename__ = 'file'

id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(64))
path = db.Column(db.String(64))
type = db.Column(db.String(6))

projectId = db.Column(db.Integer, db.ForeignKey('project.id'))
project = db.relationship('Project', backref='files')

def __init__(self, path, project):
    self.path = path
    self.project = project

    fullName = re.search('[a-zA-Z0-9]*\.[a-zA-Z]{2,}', path)
    splitName = fullName.group(0).split('.')
    self.name = splitName[0]
    self.type = splitName[1]

def __repr__(self):
    return '<File %r %r %r %r>' % (self.name, self.type, self.path, self.project)

现在的问题是:当我尝试上传文件时,它可以工作并且文件信息存储在文件表中,但它会在项目表中创建一个新条目并将其 id 链接到文件条目。例如,如果项目条目看起来像:name = TestProj1, id=1,我尝试将上传的项目链接到项目,它将创建第二个项目:name = TestProj1, id=2。
那是我的挣扎,我不知道出了什么问题。也许你们中的一些人现在。我很感激任何帮助!

附:也许它是相关的,这里是我写的表格:

class UploadForm(Form):
    fileUpload = FileField(label='Deine Datei')
    projectId = SelectField(u'Projekte', coerce=int)

【问题讨论】:

    标签: python mysql flask flask-sqlalchemy


    【解决方案1】:

    您每次都创建一个新的Project

    assocProject = models.Project(name=models.Project.query.filter_by(id=form.projectId.data).first().name)
    

    这有两件事。首先,它找到具有指定 id 的第一个项目。其次,它将该项目的名称传递给Project(),使用相同的名称创建一个新实例。

    你真正想要的是

    assocProject = models.Project.query.get(form.projectId.data)
    

    【讨论】:

      猜你喜欢
      • 2019-11-23
      • 1970-01-01
      • 2015-03-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-06
      • 1970-01-01
      相关资源
      最近更新 更多