DRF如何在需要文件上传时修补...?

时间:2015-02-19 21:00:02

标签: django-rest-framework

DRF如何在需要文件上传时进行修补,并且您不想再次发布文件?

我一直得到这样的答复:{'xyz_file':[你们没有提交文件。']}

我没有在序列化程序上使用xyz_file。这不是模型上的字段,因为我不想将其保存在数据库中。

class XYZSerializer(ParentSerializer):
    xyz_file = serializers.FileField(source='get_file_field', use_url=False, validators=[xyz_extensions_validator])

    class Meta:
        model = models.XYZModel
        fields = ('name', 'xyz_file', 'active',)

我尝试在视图和序列化程序中覆盖更新方法。两者都没有。

2 个答案:

答案 0 :(得分:2)

好的,这就是我解决问题的方法。

在我的序列化程序中,我添加了这个方法:

def exclude_fields(self, fields_to_exclude=None):
    if isinstance(fields_to_exclude, list):
        for f in fields_to_exclude:
            f in self.fields.fields and self.fields.fields.pop(f) or next()

在我的视图中,我用以下方法覆盖了更新方法:

def update(self, request, *args, **kwargs):
    partial = False
    if 'PATCH' in request.method:
        partial = True
    instance = self.get_object()
    serializer = self.get_serializer(instance, data=request.data, partial=partial)
    if 'xyz_file' in request.data and not request.data['xyz_file']:
        serializer.exclude_fields(['xyz_file'])
    if not serializer.is_valid():
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
    serializer.save()
    return Response(serializer.data)

所以我们的想法就是删除该字段,即使是经过验证也是如此。此外,如果您想在模型上的字段上运行此操作,则弹出该字段将阻止您保存未经验证的字段。

答案 1 :(得分:1)

如果您正在使用PATCH HTTP方法,那么您可以打开部分更新,这不需要我认为的任何字段。

然后在视图中的update方法中定义序列化程序:

serializer = XYZSerializer(instance=xyz,data=request.data,partial=True)

写在这里http://www.django-rest-framework.org/api-guide/serializers/#partial-updates