Django Rest Framework Запрос исправлений с загрузкой изображений
Я пытаюсь сделать конечную точку для обновления изображения профиля пользователя. Однако, когда я делаю запрос PATCH, поле profile_image не изменяется на загруженный файл. Я тестировал на postman, используя form-data, и получаю ответ "Обновление завершено", но поле 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)
Это также вернет точные ошибки из сериализатора при обновлении.