Python UnboundLocalError:局部变量';产品可用';分配前参考

Python UnboundLocalError:局部变量';产品可用';分配前参考,python,django,django-piston,Python,Django,Django Piston,我正在开发一个预订系统,我有一个功能,可以节省产品的数量。。。我的问题是为什么我会遇到这个问题?当我 `curl -l -X POST -d "product=3&client=1&function=insert_booking&check_in=2011-12-15&check_out=2011-12-10&no_of_adult=2&no_of_kid=1&quantity=2&first_name=asda&last_

我正在开发一个预订系统,我有一个功能,可以节省产品的数量。。。我的问题是为什么我会遇到这个问题?当我

`curl -l -X POST -d "product=3&client=1&function=insert_booking&check_in=2011-12-15&check_out=2011-12-10&no_of_adult=2&no_of_kid=1&quantity=2&first_name=asda&last_name=sdsd&contact=34343" http://127.0.0.1:8000/api/reserve`


Piston/0.3dev (Django 1.3.1) crash report:

Traceback (most recent call last):

  File "/home/agileone/workspace/bookproj/api/handlers.py", line 206, in create
    prodAvailable = Hotel.objects.get_hotel_sum_quantity(attrs['product'], attrs['check_in'], attrs['check_out'])

  File "/home/agileone/workspace/bookproj/../bookproj/booking/models.py", line 49, in get_hotel_sum_quantity
    if prod_Available <= 0:

UnboundLocalError: local variable 'prod_Available' referenced before assignment
这是我在models.py中的代码

def get_hotel_sum_quantity(self, product_id, checkin_date, checkout_date):
        check_in = datetime.datetime.strptime(checkin_date, '%Y-%m-%d')
        check_in = check_in.date()
        start_date = check_in.day

        check_out = datetime.datetime.strptime(checkout_date, '%Y-%m-%d')
        check_out = check_out.date()
        end_date = check_out.day

        prod = Product.objects.get(id=product_id)

        for x in range(start_date,end_date + 1):
            x = x - start_date
            delta = datetime.timedelta(days=x)
            all_date = check_in + delta
            sumOfQuantity = HotelCheck.objects.filter(date_booked=all_date, product=prod).aggregate(Sum('quantity'))['quantity__sum']
            if sumOfQuantity == None:
                sumOfQuantity = 0
            prod_Available = prod.quantity - sumOfQuantity
            #global prod_Available
        if prod_Available <= 0:
            status = 0
        else:
            status = 1

        return status
def get_hotel_sum_数量(自身、产品id、入住日期、结账日期):
签入=datetime.datetime.strtime(签入日期,%Y-%m-%d)
签入=签入日期()
开始日期=签入日期
签出=datetime.datetime.strtime(签出日期,%Y-%m-%d)
签出=签出日期()
结束日期=退房日期
prod=Product.objects.get(id=Product\u id)
对于范围内的x(开始日期、结束日期+1):
x=x-开始日期
delta=datetime.timedelta(天=x)
所有日期=签入+增量
sumOfQuantity=HotelCheck.objects.filter(date\u booked=all\u date,product=prod.aggregate(Sum('quantity'))['quantity\u Sum']
如果sumOfQuantity==无:
数量总和=0
可用产品数量=产品数量-数量总和
#全球产品可用

如果prod_Available有时您没有输入循环,因此不会创建
prod_Available
,但您尝试引用它

在循环put
prod\u Available=0
之前:

    prod = Product.objects.get(id=product_id)

    prod_Available = 0 # !

    for x in range(start_date,end_date + 1):
        x = x - start_date
        delta = datetime.timedelta(days=x)
        all_date = check_in + delta
        sumOfQuantity = HotelCheck.objects.filter(date_booked=all_date, product=prod).aggregate(Sum('quantity'))['quantity__sum']
        if sumOfQuantity == None:
            sumOfQuantity = 0
        prod_Available = prod.quantity - sumOfQuantity
        #global prod_Available
    if prod_Available <= 0:
        status = 0
    else:
        status = 1

    return status
prod=Product.objects.get(id=Product\u id)
产品可用=0#!
对于范围内的x(开始日期、结束日期+1):
x=x-开始日期
delta=datetime.timedelta(天=x)
所有日期=签入+增量
sumOfQuantity=HotelCheck.objects.filter(date\u booked=all\u date,product=prod.aggregate(Sum('quantity'))['quantity\u Sum']
如果sumOfQuantity==无:
数量总和=0
可用产品数量=产品数量-数量总和
#全球产品可用

如果prod_可用只需在以下for语句之前将
prod_可用
初始化为

for x in range(start_date,end_date + 1): 
由于您在循环内部为可用的
prod\u
赋值,因此有可能从未分配变量,并且下面的
if
语句将失败

if prod_Available <= 0:

将解决您的问题

由于传递不同的值,您将获得不同的行为

对于第一个呼叫,您通过了
签入class='2011-12-15'
签出class='2011-12-10'
,对于第二个呼叫,您通过了
签入class='2011-12-10'
,以及
签出class='2011-12-15'
。即,签入和签出值交换

这意味着范围内x的
(开始日期,结束日期+1):
循环将永远不会执行,因此永远不会设置
prod\u Available

这里有两个明显的修复方法:

  • 改进参数验证,并在签出日期早于签入日期时报告错误

  • 在开始循环之前,将可用的产品设置为零。这将确保它始终处于设置状态,即使循环没有执行

  • for x in range(start_date,end_date + 1): 
    
    if prod_Available <= 0:
    
    prod_Available =0  #Initialize outside loop
    for x in range(start_date,end_date + 1):