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
,但您尝试引用它
在循环putprod\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):