【问题标题】:FileField not working with ArrayField in DjangoFileField 在 Django 中不能与 ArrayField 一起使用
【发布时间】: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


【解决方案1】:

不幸的是,ArrayField 不支持 FileFields :(。There's an open ticket on this issue,甚至在线程中还有一个“肮脏”的实现——不过已经 4 岁了。

我通常做的是有一个单独的模型来保存文件,为你拥有的主模型保留一个外键,如下所示:

class Question(models.Model):

    <your_model_here>


class OutsideAsset(models.Model):

    question = models.ForeignKey(
        Question,
        related_name='outside_assets',
        on_delete=models.CASCADE,
    )

    file = models.FileField(...)

您可以对unquoted_sharescapital_gains 的其他字段重复此操作。

【讨论】:

  • 多文件上传还有其他方法吗
  • 我链接的票上有一段代码摘录:code.djangoproject.com/attachment/ticket/25756/multiple.py 但是,我建议您仅在能够理解代码所做的所有事情时才使用它 - 特别是因为我甚至不确定它是否会成为即插即用的东西。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-01-17
  • 1970-01-01
  • 1970-01-01
  • 2015-01-18
  • 1970-01-01
  • 2018-11-10
  • 2012-07-14
相关资源
最近更新 更多