带有图像上传的 Django Rest Framework 补丁请求
Django Rest Framework Patch Request with Image Upload
我正在尝试创建一个端点来更新用户的个人资料图片。但是,每当我发出 PATCH 请求时,profile_image 字段不会更改为上传的文件。我已经使用表单数据对邮递员进行了测试,我得到了“更新完成”的响应,但 profile_image 字段仍然为空。
views.py
class ProfileImageView(APIView):
parser_classes = [MultiPartParser, FormParser]
def patch(self, request, user_email, format=None):
print(request.data)
profile = ProfileImage.objects.get(user_email=user_email)
serializer = ProfileImageSerializer(profile, data=request.data, partial=True)
data = {}
if serializer.is_valid():
serializer.update(profile, request.data)
data["response"] = "Update completed."
data["user_email"] = user_email
data["profile_image"] = (
profile.profile_image.url if profile.profile_image else None
)
return Response(serializer.data)
data["response"] = "Wrong parameters."
return Response(data)
models.py
class ProfileImage(models.Model):
user_email = models.CharField(max_length=255)
profile_image = models.ImageField(
upload_to="uploads/",
height_field=None,
width_field=None,
null=True,
blank=True,
)
serializers.py
class ProfileImageSerializer(serializers.ModelSerializer):
class Meta:
model = ProfileImage
fields = ["user_email", "profile_image"]
urls.py
urlpatterns = [
path("api-auth/", include("rest_framework.urls")),
path("admin/", admin.site.urls),
path("register/", RegisterView.as_view(), name="register"),
path("login/", obtain_auth_token, name="login"),
path("log/add/", LogView.as_view(), name="log"),
path("log/all/", LogView.getAll, name="logall"),
path("log/<str:user_email>/", LogView.getByUserEmail, name="logbyuseremail"),
path("profile/<str:user_email>/", ProfileView.profile, name="profile"),
path("edit-profile/<str:user_email>/", ProfileView.as_view(), name="profile"),
path(
"profile-image/<str:user_email>/",
ProfileImageView.getProfileImage,
name="profile-image",
),
path(
"edit-profile-image/<str:user_email>/",
ProfileImageView.as_view(),
name="profile-image",
),
path("events/", EventView.as_view(), name="events"),
]
urlpatterns += staticfiles_urlpatterns()
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
您需要使用 .save()
作为您的序列化程序,而不是像这样:
if serializer.is_valid():
try:
serializer.save()
except ValueError:
return Response({"detail": "Serializer is not valid"}, status=400)
return Response({"detail": "Updated."})
else:
return Response(serializer.errors)
这也会 return 更新时序列化程序的确切错误。
我正在尝试创建一个端点来更新用户的个人资料图片。但是,每当我发出 PATCH 请求时,profile_image 字段不会更改为上传的文件。我已经使用表单数据对邮递员进行了测试,我得到了“更新完成”的响应,但 profile_image 字段仍然为空。
views.py
class ProfileImageView(APIView):
parser_classes = [MultiPartParser, FormParser]
def patch(self, request, user_email, format=None):
print(request.data)
profile = ProfileImage.objects.get(user_email=user_email)
serializer = ProfileImageSerializer(profile, data=request.data, partial=True)
data = {}
if serializer.is_valid():
serializer.update(profile, request.data)
data["response"] = "Update completed."
data["user_email"] = user_email
data["profile_image"] = (
profile.profile_image.url if profile.profile_image else None
)
return Response(serializer.data)
data["response"] = "Wrong parameters."
return Response(data)
models.py
class ProfileImage(models.Model):
user_email = models.CharField(max_length=255)
profile_image = models.ImageField(
upload_to="uploads/",
height_field=None,
width_field=None,
null=True,
blank=True,
)
serializers.py
class ProfileImageSerializer(serializers.ModelSerializer):
class Meta:
model = ProfileImage
fields = ["user_email", "profile_image"]
urls.py
urlpatterns = [
path("api-auth/", include("rest_framework.urls")),
path("admin/", admin.site.urls),
path("register/", RegisterView.as_view(), name="register"),
path("login/", obtain_auth_token, name="login"),
path("log/add/", LogView.as_view(), name="log"),
path("log/all/", LogView.getAll, name="logall"),
path("log/<str:user_email>/", LogView.getByUserEmail, name="logbyuseremail"),
path("profile/<str:user_email>/", ProfileView.profile, name="profile"),
path("edit-profile/<str:user_email>/", ProfileView.as_view(), name="profile"),
path(
"profile-image/<str:user_email>/",
ProfileImageView.getProfileImage,
name="profile-image",
),
path(
"edit-profile-image/<str:user_email>/",
ProfileImageView.as_view(),
name="profile-image",
),
path("events/", EventView.as_view(), name="events"),
]
urlpatterns += staticfiles_urlpatterns()
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
您需要使用 .save()
作为您的序列化程序,而不是像这样:
if serializer.is_valid():
try:
serializer.save()
except ValueError:
return Response({"detail": "Serializer is not valid"}, status=400)
return Response({"detail": "Updated."})
else:
return Response(serializer.errors)
这也会 return 更新时序列化程序的确切错误。