我在views.py中有这段代码:
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 :(得分:0)
如果我们将您的m
和n
查询视为:
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)]
所以你可以&#34;转置&#34;的是:
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
结果。
或者使用OrderedDict
作为您的JSON名称和列名称值并进一步概括:
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值。