2017-03-01 10 views
0

私がこの関数を書いたやり方は今ではうまくいっていますが、それを書くためのより良い、あるいはより効率的な方法があるかどうかは不思議です。地理学をさらにフィルタリングするためのリストを取得するajax呼び出しです。たとえば、countyが選択されている場合、その州のすべての郡のリストが取得されます。 私はまだコーディングを学んでおり、良いコーディング手法を使うことでよりうまくやりたいと思っています。この関数を書くより効率的な方法は? (Django、AJAX)

$.ajax({ 
     url : "filters", 
     type : "POST", 
     data : { search : selected_state, geog : selected_geog }, 
     success: function(data) { 
      $.each(data, function(i, v) { 
       switch(selected_geog) { 
       case 'County': 
       case 'Dma': 
        filters.push(v.fields.name); 
        break; 
       case 'Zip': 
        var exists = $.inArray(v.fields.zcta, data_check); 
        if (exists < 0) { 
        data_check.push(v.fields.zcta); 
        } 
        data_check.sort(); 
        var exists2 = $.inArray(v.fields.county, filters); 
        if (exists2 < 0) { 
        filters.push(v.fields.county); 
        } 
        filters.sort(); 
        break; 
       case 'CD': 
        filters.push(v.fields.cd114fp); 
        break; 
       case 'Zones': 
        var exists = $.inArray(v.fields.p_dma, filters); 
        if (exists < 0) { 
        filters.push(v.fields.p_dma); 
        } 
        filters.sort(); 
        var exists2 = $.inArray(v.fields.owner, attrfilters); 
        if (exists2 < 0) { 
        attrfilters.push(v.fields.owner); 
        } 
        SHPconverter.attrfilters.sort(); 
        var exists3 = $.inArray(v.fields.scode, data_check); 
        if (exists3 < 0) { 
        data_check.push(v.fields.scode); 
        } 
        data_check.sort(); 
        break; 
       } 
      }) 
     } 
     }) 

、ここでDjangoのビュー

def filters(request): 
    searchVar = request.POST.getlist('search[]') 
    geogVar = request.POST.get('geog') 

    if geogVar == 'County': 
     county_as_json = serialize(
      'json', County.objects.filter(
      state__in=searchVar).order_by('state', 'name')) 
     return HttpResponse(county_as_json, content_type='json') 

    elif geogVar == 'DMA': 
     dma_as_json = serialize(
      'json', Dma.objects.filter(
      state__in=searchVar).order_by('state', 'name')) 
     return HttpResponse(dma_as_json, content_type='json') 

    elif geogVar == 'CD': 
     cd_as_json = serialize(
      'json', Cd.objects.filter(
      state__in=searchVar).order_by('state', 'cd')) 
     return HttpResponse(cd_as_json, content_type='json') 

    elif geogVar == 'Zip': 
     zip_as_json = serialize(
      'json', Zip.objects.filter(
      state__in=searchVar).order_by('state', 'county')) 
     return HttpResponse(zip_as_json, content_type='json') 

    elif geogVar == 'Zones': 
     zones_as_json = serialize(
      'json', Zones.objects.filter(
      state__in=searchVar).order_by('sname')) 
     return HttpResponse(softzones_as_json, content_type='json') 
+4

試してみてくださいhttp://codereview.stackexchange.com/ –

答えて

1

geo_lookup = {'County': (County, ['state', 'name']), 
        'DMA': (Dma, ['state', 'name']), 
        'CD': (Cd, ['state', 'cd']), 
        'Zip': (Zip, ['state', 'county']), 
        'Zones': (Zones, ['sname']), 
        } 

lookup_model = geo_lookup[geogVar][0] 
ordering = geo_lookup[geogVar][1] 
as_json = serialize('json', lookup_model.objects.filter(state__in=searchVar).order_by(*ordering)) 
return HttpResponse(as_json, content_type='json') 

値としてタプルで辞書検索を作成することによって、ステートメントセクションは、あなたがまたあるように見える場合は、全体を減らすことができますDjango Rest Frameworkが特化したモデルを直列化しようとしているので、代わりにそれを使用するだけで、手動ですべてをビューで実行する必要がなくなります。

+1

完璧な答え!どうもありがとう! – captnvitman

関連する問題