【问题标题】:Django get_queryset returns 500 instead of 404Django get_queryset 返回 500 而不是 404
【发布时间】:2018-12-27 18:59:36
【问题描述】:

这是我的看法:

class SampleViewSet(viewsets.ModelViewSet):
      serializer_class = SampleSerializer
      queryset = Sample.objects.all()

      def get_queryset(self):
          queryset = self.queryset
          test_code = self.request.query_params.get('test_code', None)
          if test_code is not None:
             queryset = queryset.filter(test__test_code=test_code)
          return queryset

这是我的模型:

class Sampe(models.Model):
      test = models.OneToOneField(Test, null=True, blank=True, on_delete=models.CASCADE)
      # few more fields- not so important

这是我的序列化器:

class SampleSerializer(serializers.ModelSerializer):
      test_code = serializers.CharField(source='test.test_code')

      class Meta:
           model = Sample
           fields = '__all__'

这在我点击 /api/sample?test_code="existing_param" 时有效 因此,当我执行 /api/sample?test_code="Not_Existing_param" 时,我期望它应该抛出 404,而不是抛出 500 测试匹配查询不存在。非常感谢任何帮助。

谢谢

【问题讨论】:

    标签: django django-models django-rest-framework django-views


    【解决方案1】:

    问题是该函数会引发错误,而网络服务器无法真正解释导致此错误的原因,因此通常引发 500 比 404 更准确.

    但您可以使用get_list_or_404,它的作用类似于get_object_or_404,但随后使用.filter(..) 而不是.get(..)

    from django.shortcuts import get_list_or_404
    
    class SampleViewSet(viewsets.ModelViewSet):
          serializer_class = SampleSerializer
          queryset = Sample.objects.all()
    
          def get_queryset(self):
              queryset = self.queryset
              test_code = self.request.query_params.get('test_code', None)
              if test_code is not None:
                 queryset = get_list_or_404(queryset, test__test_code=test_code)
              return queryset

    因此,这将过滤查询集,并引发 404 异常,以防生成的查询集为空。如果您将过滤器在一起,则在最后一个元素上执行此操作就足够了,因为那时您检查您将返回的实际查询集,从而避免检查过程中稍后未使用的多个查询集.

    【讨论】:

    猜你喜欢
    • 2020-07-06
    • 2011-05-04
    • 2020-09-12
    • 2010-11-04
    • 1970-01-01
    • 2023-03-12
    • 2011-12-02
    • 2017-10-16
    • 1970-01-01
    相关资源
    最近更新 更多