【问题标题】:Creating multiple model instances in DRF3在 DRF3 中创建多个模型实例
【发布时间】:2015-08-01 00:52:45
【问题描述】:

1) 我想用一个 API 调用创建多个模型实例,就像在这里问的那样:How do I create multiple model instances with Django Rest Framework? 我尝试了链接中命名的解决方案,但没有成功。

我正在尝试在一个 API 调用中上传多个文件。 结果:文件被上传(只有一次我覆盖了 perform_create)但只创建了一个实例(如果我发送两个文件,只有后者被创建为实例)。

我的代码:

class FileUploadSerializer(serializers.ModelSerializer):
    def __init__(self, *args, **kwargs):
        many = kwargs.pop('many', True)
        super(FileUploadSerializer, self).__init__(many=many, *args, **kwargs)

    class Meta:
        model = FileUpload
        read_only_fields = ('created', 'datafile', 'owner')

class FileUploadViewSet(viewsets.ModelViewSet):
    queryset = FileUpload.objects.all()
    serializer_class = FileUploadSerializer
    parser_classes = (MultiPartParser, FormParser, )

    def perform_create(self, serializer):
        file_list = self.request.data.getlist('file')
        for item in file_list:
            serializer.save(file=item)

我在正确的轨道上吗?文档http://www.django-rest-framework.org/api-guide/serializers/#dealing-with-multiple-objects 提到:“要序列化查询集或对象列表而不是单个对象实例,您应该在实例化序列化程序时传递 many=True 标志。然后您可以传递要序列化的查询集或对象列表。 " => 应该可以的……

2) 使用 django-rest-framework-bulk 会更好吗? https://github.com/miki725/django-rest-framework-bulk

【问题讨论】:

标签: django django-models django-views django-rest-framework


【解决方案1】:

从 Django REST framework 3.1 开始,无法使用表单数据提交多个值。这是因为没有标准化的方式来发送具有关联的数据列表,这是处理ListSerializer 所必需的。

有计划实施HTML JSON forms 支持,这最终将允许它与标准一起使用。这是 Django REST framework 3.2 的里程碑,但尚未完成。


在此之前,建议使用 JSON 代替表单数据。批量创建和更新支持 JSON,and you can read about how to impelement it here。替代方法是 use django-rest-framework-bulk,它可以做同样的事情。

要使用 JSON 上传文件,您需要对文件进行 base64 编码并使用a custom Base64ImageField 来允许上传。这是因为JSON does not natively support file uploads。

【讨论】:

  • 好的,谢谢。文档没有对我说清楚 - 将尝试使用 DRF - 批量!
  • 顺便说一句,批量上传几个base64编码的zip文件是个好主意吗?一个 zip 文件大小约为 3 - 5 MB。
  • 不,可能不是。许多 Web 服务器会拒绝超过一定大小限制 (10-25MB) 的请求。这对于通过 JSON 发送文件来说并不特殊(尽管请求更大),但标准文件上传也会遇到类似的限制。
猜你喜欢
  • 2021-01-05
  • 2013-10-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-23
  • 1970-01-01
  • 2023-03-16
  • 2017-06-03
相关资源
最近更新 更多