2017-11-20 1 views
0

쿼리에서 전체 열을 응답에서 제외하고자하는 쿼리를 요청하고 있습니다.이 경우에는 열의 수를 계산합니다. 그러나 응답은 데이터베이스에서 모든 열을 반환합니다. 지연을 사용하려고하지만 작동하지 않습니다.Defer() Django의 쿼리 집합이 작동하지 않습니다.

내가 뭘 잘못하고 있니?

Views.py

def product_table(request): 
    width = request.GET['width'] 
    length = request.GET['length'] 
    prod_filter = Product.objects.filter(length=length,width=width).defer('weigth') 
    data_prod =serializers.serialize('json', prod_filter) 
    return JsonResponse({'data_prod':data_prod}) 

HTML을

... 
    <div> 
     <table id="id_prod" class="table table-striped table-bordered table-hover"></table> 
    </div> 
    <script> 
     $(document).ready(function(){ 
      ... 
       $.get('{% url "prod_table" %}',function (data_prod) { 
        var data_json = JSON.parse(data_prod['data_prod']); 
        var data_array = []; 
        for(var i = 0; i < data_json.length; i++) { 
         var arr = $.map(data_json[i]['fields'], function(el) { return el }); 
         data_array.push(arr); 
        } 


        $('#id_prod').DataTable({ 
         destroy: true, 
         data: data_array, 
         columns: [ 
          { title: "Name" }, 
          { title: "width" }, 
          { title: "length" }, 
          { title: "volume" }, 

         ] 
        }); 
       }); 
+0

참고가 repply하기에 – Alasdair

+0

확인 .. weight''맞춤법이 틀린,하지만 어떻게 내가의 검색어 필터에서 별개처럼 이중성을 제거 할 수 직렬화에 argumet을 포함 할 수있다? –

답변

0

@Alasdair에 따르면, 당신이 원하지 않는 필드를 반환하지 않도록 seralizer에 알려야합니다. defer()을 사용하면 Django가 데이터베이스에서 해당 열을로드 할 때까지 기다릴뿐입니다. 따라서 serializer가 해당 필드의 값을 serialize하려고하면 읽습니다. defer()은 해당 필드를 사용하지 못하도록 차단하지 않으며 검색을 지연시킵니다. documentation에서

:

여전히 모델 인스턴스를 반환 연기 필드를 가진 검색어 세트. 해당 필드에 에 액세스하면 각 지연 필드가 데이터베이스에서 검색됩니다 (한 번에 하나씩, 동시에 모든 지연 필드가 하나씩 표시됨).

+0

감사합니다 kichik 많이 .. 지금은 과정을 이해! –

1

귀하의 defer() 통화는 검색어 세트를 가져 오는 경우 열을로드에서 장고를 방지 할 수 있습니다. 그러나 serializer는 지연 필드의 값을 필요로하므로 나중에 값을 가져옵니다. 즉, 지연을 전혀 사용하지 않았다면 더 많은 쿼리를 수행하게됩니다. 실제로, .defer('weight') 최적화 아마 필요가 없다고

data_prod =serializers.serialize('json', prod_filter, fields=['width', 'length', ...) 

참고 : 만 serialize a subset of the fields하려면

는, 당신은 당신이 검색어 세트를 직렬화 할 때 fields을 지정해야합니다. 실제로는 쿼리 시간이 눈에 띄게 감소하지 않을 수도 있습니다.

+0

안녕 Alasdair .. 덕분에 해결됩니다 –

+0

queryset에서 distinct를 적용하고 serialize 한 후. 나는 이중성을 유지할 것인가? 어떻게 해결할 수 있습니까? –

+0

귀하의 의견을 이해할 수 없습니다. 이것은 원래 질문과 다른 이슈처럼 들립니다. – Alasdair

관련 문제