2013-10-09 1 views
0

Я делаю следующее, когда я получаю, чтобы отправлять данные на запросы:динамический запрос после получения данных питона

fields = [ 
'name', 
'surname', 
'weight', 
'height', 
'position', 
'agent', 
'nationality', 
'shirt_name', 
'shirt_number', 
'preferred_foot', 
] 

if request.method == 'POST': 

    filter_spec = None 
    for fld_name in fields: 
     value = request.POST.get(fld_name, None) 
     if value is not None: 
      if fld_name == 'position': 
       fld_name = 'position__in' 
       value = Position.objects.filter(name=value) 
      if fld_name == 'agent': 
       fld_name = 'entrepreneur__in' 
       value = Entrepreneur.objects.filter(name=value) 
      if filter_spec is None: 
       filter_spec = Q(**{fld_name: value}) 
      else: 
       filter_spec &= Q(**{fld_name: value}) 
    players = Player.objects.filter(filter_spec) if filter_spec else Player.objects.none() 
    result = [p.get_json() for p in players] 
    py_resp = { 
     'meta': { 
      'total_count': len(result), 
     }, 
     'objects': result, 
    } 
    json_resp = json.dumps(py_resp) 
    return HttpResponse(json_resp, content_type='application/json') 

Чтобы разместить запрос выглядит следующим образом:

Player.objects.filter(position__in=Position.objects.filter(name=positionpost)) 

Я сделал так, как он находится на вершине, что я не в состоянии осуществить это в коде национальности, так как запрос таким образом:

Player.objects.filter(country__in=Country.objects.filter(nationality__in=Nationality.objects.filter(name='Espanhola'))) 

d Я не уверен, как это сделать в коде выше Кто-нибудь может мне помочь?

ответ

0

Оба ваших запроса могут быть значительно упрощены. Первый должен быть:

Player.objects.filter(position__name=positionpost) 

и второй:

Player.objects.filter(country__nationality__name='Espanhola') 

Они, как правило, быть более эффективными, так как они делают, а не JOIN и подзапросов.

+0

Я пробовал так и даже не должен быть ... как ... потому что я использую mongobd. Но я сомневаюсь, как я могу сделать запрос гражданства, следуя той же логике, которую я использовал для размещения представленного кода. – Helio

+0

Я не понимаю ваш комментарий. Почему эти запросы отличаются от других? 'fld_name = 'country__nationality__name'',' value =' Esnpanhola''. –

+0

эти запросы были всего лишь примером того, как они это делают ... лучше понять, потому что, заметив в моем коде, я не делаю этого напрямую – Helio

Смежные вопросы