2012-11-15 52 views
0

您好我有一個Ajax調用它迷上了一個小觀點:Django的空GET變量

def get_spans(snow_load, wind_speed, module_length): 
    spans = Spans.objects.values_list('span').filter(
     snow=snow_load, 
     wind=wind_speed, 
     module_length__gte=module_length, 
    ).order_by('span') 
    try: 
     max_span = max(spans) 
    except ValueError: 
     max_span = 0 
    return max_span 

def GetSpans(request): 
    # get variables from ajax request 
    snow_load = request.GET.get('snow_load', None) 
    wind_speed = request.GET.get('wind_speed', None) 
    module_length = request.GET.get('module_length', None) 
    # call get_spans() 
    max_span = get_spans(snow_load, wind_speed, module_length) 
    # json encode it 
    max_span = simplejson.dumps(max_span, cls=DjangoJSONEncoder) 
    return HttpResponse(
     max_span, 
     mimetype='application/json' 
    ) 

的問題是,任何這些GET變量可能是''或小數。我的問題是處理這些問題的最佳方法是什麼?如果變量是'',我會得到invalid literal for int() with base 10:錯誤。例如,我應該用None替換所有空字符串嗎?我是否應該將所有值都輸入到float

任何幫助非常讚賞

回答

1

過濾器在Django可以鏈接,這樣你就可以做到這一點:

spans = Spans.objects.values_list('span') 
if snow_load: 
    spans.filter(snow=snow_load) 
if wind_speed: 
    spans.filter(wind=wind_speed) 
if module_length: 
    spans.filter(module_length__gte=module_length) 

return max(spans.order_by('span')) 
+0

我認爲這是我所需要的。如果任何變量的值是''或None,我只想從過濾器中折扣它並返回一個更大的查詢集。這是達到這個目標的最pythonic方式嗎? –

+0

它的___方式清晰易懂(這是pythonic的一部分)。 「if」檢查將在「falsey」值(例如'''')和明顯的'None'上失敗。 –

+0

這是否會對db進行一次或三次調用? –

1

在你的函數get_spans可以排除空或無字段:

def get_spans(*args, **kwargs): 
    my_dict = {} 
    for key in kwargs: 
     if kwargs[key]: 
     my_dict[key] = kwargs[key] 
    spans = Spans.objects.values_list('span') \ 
         .filter(**my_dict) \ 
         .order_by('span') 
    #rest of code 

打電話給你get_spans功能:

get_spans(snow=snow_load, wind=wind_speed, module_length__gte=module_length) 

更優雅

Requires python2.7+

def get_spans(*args, **kwargs): 
    my_dict = {key:val for (key, val) in kwargs.iteritems() if val} 
    spans = Spans.objects.values_list('span') \ 
         .filter(**my_dict) \ 
         .order_by('span') 
    #rest of code 
+0

是你想要的嗎? –

+0

絕對到達那裏。這隻對我有價值的字段進行過濾。這是正確的不是嗎? –

+0

顯然它會排除那些空或無的字段。 –