django序列化程序尝试在try-except块内分配之前引用变量

时间:2018-11-06 10:03:51

标签: django

这是获取3个对象并使用Ajax返回模板的视图

def getText(request):
    l=request.POST.get('lid','')
    n=request.POST.get('cid','')
    o=request.POST.get('pid','')
    # print(l)
    try:
        lb=books.objects.get(id=l)
        con=contacts.objects.get(id=n)
        mo=movies.objects.get(id=o)
    except books.DoesNotExist:
        lb=None
    except contacts.DoesNotExist:
        con=None
    except movies.DoesNotExist:
        mo=None
    serialized_obj = serializers.serialize('json', [ lb,con,mo ])
    return HttpResponse(serialized_obj,content_type='application/json')

我收到以下错误 UnboundLocalError:分配前引用了本地变量'mo'

3 个答案:

答案 0 :(得分:1)

您没有与id = n的联系人。 所以异常被抛出了

except contacts.DoesNotExist: con=None

con被分配为无

因此mo=movies.objects.get(id=o)未执行。

serialized_obj = serializers.serialize('json', [ lb,con,mo ])接下来执行,因此在分配之前先引用了

答案 1 :(得分:1)

try块中引发异常时,将执行第一个匹配的处理程序(except块),然后,执行将跳转到整个{{1}之后的第一个语句} (nb:当然有一个匹配的处理程序)。因此,在您的情况下:

try/except

如果try块中的第一条语句引发了try: lb=books.objects.get(id=l) con=contacts.objects.get(id=n) mo=movies.objects.get(id=o) except books.DoesNotExist: lb=None except contacts.DoesNotExist: con=None except movies.DoesNotExist: mo=None serialized_obj = serializers.serialize('json', [ lb,con,mo ]) ,则执行流跳至第一个Book.DoesNotExist子句(它将except设置为lb,__然后跳转到None语句。此时,serialized_obj = serializers.serialize('json', [ lb,con,mo ])con都没有定义,因此会出错。

这里有两种可能的解决方案:第一种是每个语句使用一个mo,即:

try/except

这是一个好习惯(非常明确,每个try块中都包含了尽可能少的代码,等等),但是有点冗长。在您的情况下,另一种(更简单的)解决方案是先将所有三个名称定义为try: lb=books.objects.get(id=l) except books.DoesNotExist: lb=None try: con=contacts.objects.get(id=n) except contacts.DoesNotExist: con=None try: mo=movies.objects.get(id=o) except movies.DoesNotExist: mo=None ,然后使用空的None子句进行try / except,即:

except

答案 2 :(得分:0)

在此代码中,如果不存在书籍或联系人,则转到相应的例外并将其设置为None,但mo仍未定义。