Django REST框架文件上载不工作

Django REST框架文件上载不工作,django,python-3.x,django-rest-framework,Django,Python 3.x,Django Rest Framework,在Django REST框架文件上载中 我有一个模型,它有两个字段和一个可选附件FileField class Task(model.Model): attachment = models.FileField(upload_to=default_location, null=True, blank=True) ... some extra fields 此模型有一个ModelViewset来实现CRUD功能。 用户可以在模型中创建带有/不带有附件的条目 class TaskVi

在Django REST框架文件上载中

我有一个模型,它有两个字段和一个可选附件FileField

class Task(model.Model):
    attachment = models.FileField(upload_to=default_location, null=True, blank=True)
    ... some extra fields
此模型有一个ModelViewset来实现CRUD功能。 用户可以在模型中创建带有/不带有附件的条目

class TaskViewSet(viewsets.ModelViewSet):
    serializer_class = TaskSerializer

    def get_queryset(self):
        return Task.objects.all()
Serilaizer有一个额外的布尔字段来决定是否保留最后一个附件。此字段将在前端呈现为复选框

class TaskSerializer(serializers.ModelSerializer):
    keep_previous_attachment = serializers.BooleanField(default=False)

    class Meta: 
        model = Task
        fields = ['id','attachment', 'heading']
当用户创建新条目时,它将按预期工作。它将附件存储到其默认位置。 当用户更新带有/不带附件的条目时,事情不会按预期进行

当我使用PUT方法更新ModelViewset的URL时, 1.当django服务器重新启动时,第一次尝试可以正常工作。以前的附件被覆盖。 2.对URL的所有后续请求都不起作用。它只是重命名旧文件,重命名后的文件成为当前附件。 3.如果我使用PATCH方法,我根本无法访问serializer类的已验证\u数据中的keep_previous_附件。 4.在调用instance.save之前,一切正常。该方法以某种方式引用旧附件,重命名为其他内容,并将重命名后的附件存储为当前附件,而旧附件仍保留在uploads文件夹中

预期结果是: 当用户使用更新视图更新现有条目时, 以前的附件应被覆盖,即删除以前的文件并存储新文件

我已经覆盖了下面给出代码的序列化程序类上的update方法。我已经复制粘贴了serializer类的原始更新代码,并做了一些更改。作为实例,我无法实现预期结果。保存方法不会覆盖以前的附件,即即使在处理新附件时,它仍在存储以前的附件,直到调用instance.save方法。我试过传球,force_update=True,它也不起作用。我不知道这里出了什么问题

def update(self, instance, validated_data):

    from rest_framework.serializers import raise_errors_on_nested_writes
    raise_errors_on_nested_writes('update', self, validated_data)

    from rest_framework.utils import model_meta
    info = model_meta.get_field_info(instance)

    keep_old = validated_data.pop("keep_previous_attachment")
    validated_attachment = validated_data.pop("attachment")

    # Simply set each attribute on the instance, and then save it.
    # Note that unlike `.create()` we don't need to treat many-to-many
    # relationships as being a special case. During updates we already
    # have an instance pk for the relationships to be associated with.

    for attr, value in validated_data.items():
        if attr in info.relations and info.relations[attr].to_many:
            field = getattr(instance, attr)
            field.set(value)
        else:
            setattr(instance, attr, value)

    if keep_old is False:

        # delete the references to the older attachment
        instance.attachment = None 
        instance.save()


        deletion_path = os.path.join("location_of_folder")

        deleted = delete_task_attachments(deletion_path, request)

        instance.attachment = validated_attachment

    # if keep_old is True:
    #     instance.attachment is untouched by the code, so no update will happen.

    # print()
    # print("BEFORE SAVE")
    # print("instance.attachment")
    # print(instance.attachment)
    # print()

    instance.save()

    # print()
    # print("After SAVE")
    # print("instance.attachment")
    # print(instance.attachment)
    # print()

    return instance
请给我一个解决办法。
提前谢谢。

如果keep_old:中的代码为False,您确定吗:正在运行?是的,我在过去三天内测试了几次。为了向您展示代码,我删除了几个print语句,它们向我显示了运行哪段代码的详细日志。我确信instance.save()是问题的根本原因。在调用instance.save之前,一切正常。该方法以某种方式引用旧附件,重命名为其他内容,并将重命名后的附件存储为当前附件,而旧附件仍保留在uploads文件夹中。如果keep_old为False:正在运行,您是否确实知道
中的代码?是的,我在过去三天内对其进行了多次测试。为了向您展示代码,我删除了几个print语句,它们向我显示了运行哪段代码的详细日志。我确信instance.save()是问题的根本原因。在调用instance.save之前,一切正常。该方法以某种方式引用旧附件,重命名为其他内容,并将重命名后的附件存储为当前附件,而旧附件仍保留在uploads文件夹中。