0

こんにちは、小さなビューに接続されている ajax 呼び出しがあります。

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 変数のいずれかが''または 10 進数である可能性があることです。私の質問は、これらを処理する最良の方法は何ですか? 変数が次の場合、''エラーがinvalid literal for int() with base 10:発生します。Noneたとえば、すべての空の文字列を置き換える必要がありますか? すべての値を にキャストする必要がありますfloatか?

どんな助けでも大歓迎です

4

2 に答える 2

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'))
于 2012-11-15T22:37:57.410 に答える
1

関数get_spansでは、空のフィールドまたは None フィールドを除外できます。

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
于 2012-11-15T22:21:43.917 に答える