2013-10-09 91 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