2011-12-08 13 views
1

予約システムを開発していますが、製品の数量を節約する機能があります。ときに私UnboundLocalError:割り当て前にローカル変数 'prod_Available'が参照されています

`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 

が、私はPythonシェルでテストするとき、それが正常に動作します:ここに

>>> from booking.models import * 
>>> Hotel.objects.get_hotel_sum_quantity(3, '2011-12-10', '2011-12-15')1 

は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 

と私のhandlers.pyで私のコードです

if attrs['function'] == 'insert_booking': 

       prodAvailable = Hotel.objects.get_hotel_sum_quantity(attrs['product'], attrs['check_in'], attrs['check_out']) 
       if float(prodAvailable) <= 0: 
        disp = Hotel.objects.get_hotel_show_available(attrs['product'], attrs['check_in'], attrs['check_out']) 
        return {'status': '0', 'message': 'not OK!'}, disp  

誰でも自分の状況を説明できますそれを解決する方法についていくつかのアイデアを... ...? ありがとう

答えて

1

ループが入力されないことがあるので、prod_Availableは作成されませんが、参照しようとします。

ループはprod_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 
1

ちょうどそうそこに、あなたがループ内prod_Availableに値を代入しているためということが起こるの文

for x in range(start_date,end_date + 1): 

のために、以下の前prod_AvailableZeroに初期化その変数が決して割り当てられず、次のifステートメントが失敗する可能性があります。

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

を行う代わりに

if prod_Available <= 0: 

は、原因別の値を渡すことに

1

あなたは異なる動作を取得しているあなたの問題を解決します。

最初の呼び出しでは、check_in='2011-12-15'check_out='2011-12-10'を渡しています.2番目の呼び出しでは、checkin='2011-12-10'checkout='2011-12-15'です。つまり、チェックインとチェックアウトの値は入れ替えられます。

これは、for x in range(start_date,end_date + 1):ループが実行されないことを意味します。したがって、prod_Availableを設定することはありません。

2つの明白な修正がここにあります

  1. は、パラメータの検証を改善し、チェックアウト日はチェックイン日より前にある場合はエラーを報告します。

  2. ループを開始する前にprod_Availableをゼロに設定してください。これにより、ループが実行されなくても常に設定されます。

関連する問題