【发布时间】:2019-12-02 14:41:58
【问题描述】:
在 Django 中使用 ArrayField 中的 FileField 进行多个文件上传,但 ArrayField 将文件作为字符串而不是保存文件。
如果上述方法无法正常工作,Django 中是否还有其他工作方式用于多文件上传。
我已经尝试了一些可用的解决方案,但这些解决方案似乎/都不适用于该案例
模型.py
class Questions(models.Model):
def content_file_name(self, name):
return
outside_asset = ArrayField(models.FileField(upload_to=content_file_name, blank = True,default=False),default=[],blank=True)
unquoted_shares = ArrayField(models.FileField(upload_to=content_file_name, blank = True,default=False),default=[],blank=True)
capital_gains = ArrayField(models.FileField(upload_to=content_file_name, blank = True,default=False),default=[],blank=True)
class Meta:
db_table = 'Questionnarie'
managed = True
views.py
outside_asset_list = []
unquoted_shares_list = []
capital_gains_list = []
if form.is_valid():
for x in request.FILES:
val = x
print('val :', val)
files = request.FILES.getlist(val)
print('files inside loop :', files)
if val == 'outside_asset':
for f in files:
filename = f
outside_asset_list.append(filename)
print(outside_asset_list)
print('files :', outside_asset_list)
elif val == 'unquoted_shares':
for f in files:
filename = f
unquoted_shares_list.append(filename)
print('files :', unquoted_shares_list)
elif val == 'capital_gains':
for f in files:
filename = f
capital_gains_list.append(filename)
print('files :', capital_gains_list)
Questions.objects.create(user=user, year=year,
outside_asset=outside_asset_list,
unquoted_shares=[unquoted_shares_list],
capital_gains=[capital_gains_list])
return Response....
请求中发送的所有文件都应上传到特定文件夹,其路径应保存为数据库中的单行列表
【问题讨论】:
-
A
FileField不保存文件。FileField将文件存储在媒体目录中,并保留文件名的引用。此外,请不要使用default=[],而是使用default=list。 -
@WillemVanOnsem FileField 甚至没有将文件存储在媒体目录中。您能否进一步解释一下 default=list。 ——
-
通过使用
default=[],你传递了对同一个列表的引用,所以如果有多个Questions对象的默认值,这些将引用同一个列表,并修改第一个@ 987654329@ 对象将对第二个产生影响(反之亦然)。通过使用list,您传递了一个可调用对象,它将默认创建一个新列表。 -
@WillemVanOnsem 你能分享一些相同的代码吗
标签: django python-3.x postgresql visual-studio django-rest-framework