在Django中传递多个value_list

时间:2014-10-01 07:39:48

标签: python json django

我在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')

但是如何将其传递给我的模板?

1 个答案:

答案 0 :(得分: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)]

所以你可以&#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值。