【发布时间】: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