【问题标题】:django - class view 404 if no resultdjango - 如果没有结果,类视图 404
【发布时间】:2014-09-03 18:36:53
【问题描述】:

我有以下基于类的视图 -

class DeployFilterView(generics.ListAPIView):
    serializer_class = DefinitionSerializer

    def get_queryset(self):
        jobname = self.request.GET.get('jobname')
        if jobname.count("\\") == 1:
            jobname = jobname.replace("\\", "")
            queryset = Jobmst.objects.db_manager('Admiral').filter(jobmst_name=jobname).exclude(jobmst_prntname__isnull=True, jobmst_dirty='X')
        else:
            parent, job = jobname.rsplit('\\', 1)
            queryset = Jobmst.objects.db_manager('Admiral').filter(jobmst_prntname=parent, jobmst_name=job).exclude(jobmst_dirty='X')          

        return queryset

如果任一查询集均未返回任何信息,我希望它返回 404 响应,我该如何将其链接进去?

我正在使用 Django Rest 框架。现在,如果我调用一个 URL 并且没有数据,它会通过我不想要的 200 OK。以下是我正在尝试的 -

class DeployFilterView(generics.ListAPIView):
    serializer_class = DefinitionSerializer

    def get_queryset(self):
        jobname = self.request.GET.get('jobname')
        if jobname.count("\\") == 1:
            jobname = jobname.replace("\\", "")
            queryset = Jobmst.objects.db_manager('Admiral').filter(jobmst_name=jobname).exclude(jobmst_prntname__isnull=True, jobmst_dirty='X')
        else:
            parent, job = jobname.rsplit('\\', 1)
            queryset = Jobmst.objects.db_manager('Admiral').filter(jobmst_prntname=parent, jobmst_name=job).exclude(jobmst_dirty='X')
        try:
            if queryset == True:
                return queryset
            else:
                raise exceptions.DoesNotExist

但是它没有说我的缩进是错误的,但我不明白它是怎么回事。

【问题讨论】:

  • 您是否尝试过引发 404 异常?
  • 是的尝试异常,但我不明白为什么它不喜欢我的语法。更新以包含。
  • 您缺少一个匹配的 except 子句。您使用 try 块是否有特殊原因?你能做吗if queryset: return queryset else: raise Http404Also, see django's documentation on returning a 404.
  • 另外,你不需要if queryset == True:if queryset: 也一样。
  • 感谢您的帮助!我正在按照您的建议进行操作,我只需要获取 else 即可让异常指向 404 错误。

标签: python django django-rest-framework


【解决方案1】:

这可能会引发问题,因为您没有 except 块。您不需要保留 try 块;因为你只是在做一个 if/else 语句。

另外,您的if queryset == True: 是不必要的,您可以直接使用if queryset:

尝试类似:

from django.http import Http404

# The rest of your code here...

if queryset:
    return queryset
else:
    raise Http404

欲了解更多信息,您可以查看django's documentation on returning 404 errors

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-12-11
    • 2013-07-13
    • 1970-01-01
    • 2021-11-03
    • 2019-02-08
    • 1970-01-01
    • 2015-12-26
    相关资源
    最近更新 更多