在django中尝试/除数据库查询

Dav*_*542 1 django django-models

我正在根据数据库中的两个列表检查用户提交的电子邮件地址 - 授权域列表和授权电子邮件地址列表.目前,如果两者都没有找到,那就是一个DoesNotExist例外.如果找不到,我该如何处理?

这是我目前在views.py中的代码 -

def register(request):
    if request.method == 'POST':
        form = UserForm(request.POST)
        if form.is_valid():
            cd = form.cleaned_data
            try:
                email_list = EmailList.objects.get(domain=(cd['email'].split('@')[1]))
            except:
                email_list = EmailList.objects.get(email=cd['email'])
            #  I also need another except if neither works for the validator.
            network= Network.objects.get(network=email_list.network)
            User.objects.create(name=cd['name'], email=cd['email'], network=network)
            return HttpResponseRedirect ('/user/view/')
    else:
        form = UserForm()
    return render_to_response('register.html',{'form':form}, context_instance = RequestContext(request))
Run Code Online (Sandbox Code Playgroud)

Ign*_*ams 7

嵌套try/ except块.并且不要使用裸露except; 只捕获您可以处理的异常.

  • 在这种情况下,看起来您想要的例外是“EmailList.DoesNotExist”。 (2认同)

zee*_*kay 5

您可以嵌套try/ except

        try:
            email_list = EmailList.objects.get(domain=(cd['email'].split('@')[1]))
        except:
            try:
                email_list = EmailList.objects.get(email=cd['email'])
            except:
                ...do something else
Run Code Online (Sandbox Code Playgroud)

如果您只是使用这些 try/ except 来做一个简单的测试,那么包装 try/ except 是值得的:

def get_or_none(model, **kwargs):
    try:
        return model.objects.get(**kwargs)
    except model.DoesNotExist:
        return None
Run Code Online (Sandbox Code Playgroud)

这为您提供了更具可读性的代码:

if get_or_none(EmailList, domain='domain.com'):
    ...do something
elif get_or_none(EmailList, domain='domain.com'):
    ...do something
else:
    ...do something
Run Code Online (Sandbox Code Playgroud)

正如伊格纳西奥在他的回答中提到的,你应该始终明确并只捕获你想要的例外。