【问题标题】:Django Rest Framework Patch Request with Image Upload带有图像上传的 Django Rest Framework 补丁请求
【发布时间】:2021-12-31 01:39:52
【问题描述】:

我正在尝试创建一个端点来更新用户的个人资料图像。但是,每当我发出 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,
    )

序列化器.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)

【问题讨论】:

  • 在补丁请求中用 serializer.save() 替换 serializer.update。

标签: python django rest django-rest-framework


【解决方案1】:

您需要将.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)

这也将在您更新时从序列化程序返回确切的错误。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-10
    • 1970-01-01
    • 2020-09-23
    • 2015-07-17
    • 2020-05-21
    • 1970-01-01
    • 2016-06-26
    • 2016-03-23
    相关资源
    最近更新 更多