【问题标题】:DRF UpdateAPI View returns "detail": "Not found."DRF UpdateAPI 视图返回“详细信息”:“未找到”。
【发布时间】:2019-03-04 14:59:11
【问题描述】:

对我的 DRF 端点进行 PUT 或 PATCH 时,我收到 404 "detail": "Not found." 响应。我不确定是什么导致了错误,我的视图或序列化程序。

关于 DRF 的文档有点缺乏,并且没有可供我参考的 UpdateAPIView 工作示例。

代码:

urls.py

path('api/update/job/<int:pk>/', views.UpdateJobView.as_view() ),

序列化器.py

class JobsUpdateSerializer(serializers.ModelSerializer):
    designer_one = serializers.PrimaryKeyRelatedField(many=False, queryset=UserProfile.objects.all())
    designer_two = serializers.PrimaryKeyRelatedField(many=False, queryset=UserProfile.objects.all())
    class Meta:
        model = Job
        fields = '__all__'

views.py

class UpdateJobView(generics.UpdateAPIView):
    serializer_class = JobsUpdateSerializer
    lookup_field = "pk"

    def get_queryset(self):
        queryset = Job.objects.all()
        jobID = self.request.query_params.get('pk', None)
        if jobID is not None:
            queryset = queryset.filter(id=jobID)
        else:
            return False

我需要修改我的视图以包含get_object 函数吗?

Django==2.1.3 djangorestframework==3.9.0

【问题讨论】:

  • 我们无能为力,因为仅查看提供的代码 sn-ps 并不清楚您要做什么。
  • @Linovia 抱歉,我正在尝试将更新的值从 Vue 应用程序传递给 Django。理想情况下使用 PATCH 请求,但 PUT 也可以。每个请求只会更改一个模型值。
  • 仍然没有多说你想要做什么。阅读代码,您似乎正在尝试根据工作 id 过滤您的工作,这似乎有点奇怪。
  • 所以在我的前端,用户看到的是一个工作列表,他们能够更改每个工作中字段的值,所以当他们更新一个字段时,我通过工作 ID 来知道什么工作正在更新中。

标签: python django django-rest-framework


【解决方案1】:

self.request.query_params.get('pk', None) 是获取查询参数,而不是 URL 参数。文档过滤页面中的示例适用于 query parametersURL

在您的情况下,您不需要覆盖 get_querysetget_object。删除您的lookup_field,因为它已经默认为pk 和您的自定义get_queryset。改为定义一个queryset,并将剩余的工作留给默认的UpdateView

class UpdateJobView(generics.UpdateAPIView):
    serializer_class = JobsUpdateSerializer
    queryset = Job.objects.all()

【讨论】:

  • 不客气。也可以随意查看 DRF 源代码。通用模型方法,特别是 get_objecthere
猜你喜欢
  • 2018-08-26
  • 2018-02-13
  • 1970-01-01
  • 2020-10-11
  • 1970-01-01
  • 2017-03-17
  • 2018-07-02
  • 2020-06-30
  • 1970-01-01
相关资源
最近更新 更多