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',)
我尝试在视图和序列化程序中覆盖更新方法。两者都没有。
答案 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。