2014-10-01 23 views
0

我有這樣的代碼在views.py:傳遞多個VALUE_LIST在Django

def pins_info(request): 
    if request.method == "GET": 
     getpin = request.GET.get('pin', None) 
     m = ButuanMaps.objects.filter(clandpin=getpin). 
      values_list('landproperty__ctaxdec') 
     n = ButuanMaps.objects.filter(clandpin=getpin). 
      values_list('ssectionid__sbrgyid__cbrgyname') 
     return HttpResponse(json.dumps({'taxdec': list(m),'brgy': list(n)}), 
      content_type='application/json') 

我工作得很好,但是當我想其他的值是不是有效。我可以訪問的結果在我的模板是這樣的:

success: function(data) { 
    taxdec = data['taxdec']; 
    brgy = data['brgy']; 
    var inputform = $('#forminput').val(); 
    if(inputform == "Select Land PIN") { 
     alert('Please Select Land PIN') 
    } 
    else{ 
     $('#status').append(
      "<p>Tax Declaration: " + taxdec + "<br/>Barangay: " + brgy + "</p>" 
     ); 
    } 
} 

我如何可以簡化我的代碼,以使其更加有效,如:

m = ButuanMaps.objects.filter(clandpin=getpin). 
    values_list('landproperty__ctaxdec','ssectionid__sbrgyid__cbrgyname') 

但我怎麼把它傳遞給我的模板?

回答

0

如果我們把你的mn查詢爲:

m = range(5) 
n = range(6, 11) 

那麼你的m = ButuanMaps.objects.filter(clandpin=getpin). values_list('landproperty__ctaxdec','ssectionid__sbrgyid__cbrgyname')單查詢等效的結構:

new = zip(m, n) 
#[(0, 6), (1, 7), (2, 8), (3, 9), (4, 10)] 

所以,你可以在 「轉」 中指出:

zip(*new) 
# [(0, 1, 2, 3, 4), (6, 7, 8, 9, 10)] 

然後建立一個dict從你和你的鑰匙:

results = dict(zip(['taxdec', 'brgy'], zip(*new)))) 
# {'brgy': (6, 7, 8, 9, 10), 'taxdec': (0, 1, 2, 3, 4)} 

然後json.dumps結果。


或爲自己的JSON名和列名值的OrderedDict,並進一步推廣:

from collections import OrderedDict 

keyvals = OrderedDict([ 
    ('taxdec','landproperty__ctaxdec'), 
    ('brgy', 'ssectionid__sbrgyid__cbrgyname') 
]) 

m = ButuanMaps.objects.filter(clandpin=getpin).values_list(*keyvals.values()) 
result = dict(zip(keyvals, zip(*m))) 

這樣的話,你可以添加/刪除列進行選擇,並在一個地方及其相關的JSON值爲同一個查詢。

+0

謝謝!我使用了'OrderedDict',然後''json.dumps'結果。就像這樣:'return HttpResponse(json.dumps(result),content_type ='application/json')' – 2014-10-02 00:35:31