Django Try/Except CBV 处理查询返回 None?

Django Try/Except CBVs dealing with query returning None?

我正在尝试包含一些异常处理来处理 return None 的查询,如果 none 是 returned 我只想显示一个简单的 JsonResponse 消息。使用 FBV,我已经非常简单地完成了这项工作。但是当使用基于 class 的视图时,我的 except 块没有按我预期的那样运行。

class BusinessDetailView(DetailView):


    model = BusinessDetail

    def get_object(self, queryset=None):
        business = self.model.objects.filter(**custom filters here)).values().first()
        logger.debug(Business: {business}')
        return business


    def get(self, request, *args, **kwargs):
        try:
            try:
                business = self.get_object()
            except BusinessDetail.DoesNotExist:
                return JsonResponse({'Error': 'Business Does Not Exist.'})
            return JsonResponse(company, status=200)
        except Exception as e:
            logger.error(f'Error getting business detail with error: {e}')
            return JsonResponse({'Error': 'Database error, return to previous page'}, status=500)

get_object 方法中,记录器如我所料 returning Business: None。但是在 get 方法中, BusinessDetail.DoesNotexist 没有被击中。最后一个 Try/Except 块是被击中的块,returning return JsonResponse({'Error': 'DB error, return to previous page'}, status=500).

根据我的理解,DoesNotExist 异常会捕获查询 returning None?但就我而言,这没有发生。非常感谢任何帮助!

From my understanding, the DoesNotExist exception would catch the query returning None?

No, .first() not 在找不到记录的情况下引发错误,在这种情况下只是 returns None。因此,这将 not 引发任何 DoesNotExist 异常。 DoesNotExist 异常没有任何“特殊”之处,这只是与其他任何异常一样的异常。

您使用 .get(…) [Django-doc] 而不是 .first() 得到 DoesNotExist:

def get_object(self, queryset=None):
    business = self.model.objects.values()<b>.get(</b>**custom filters here<b>)</b>
    logger.debug(Business: {business}')
    return business