gpt4 book ai didi

Django get_queryset 返回 500 而不是 404

转载 作者:行者123 更新时间:2023-12-02 20:20:55 24 4
gpt4 key购买 nike

这是我的观点:

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 测试匹配查询不存在。非常感谢任何帮助。

谢谢

最佳答案

问题在于该函数会引发错误,而 Web 服务器无法真正解释导致此错误的原因,因此一般来说引发 500 比 404 更准确.

但是你可以做的是使用 get_list_or_404其行为类似于 get_object_or_404,但随后使用 .filter(..) 而不是 .get(..):

from django.shortcuts import <b>get_list_or_404</b>

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 = <b>get_list_or_404(queryset, test__test_code=test_code)</b>
return queryset

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

关于Django get_queryset 返回 500 而不是 404,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51426033/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com