2010-01-20 5 views
1

J'ai cette jointure:API Django QuerySet: Comment rejoindre iexact et icontains?

lawyers = Lawyer.objects.filter(last__iexact=last_name).filter(first__icontains=first_name) 

This is the site

Si vous essayez Nom: Abbas et Prénom: Amr il vous dit que amr abbas a 1 camarades d'école.

Mais si vous essayez seulement le prénom, il est dit qu'il n'y a pas d'avocats dans la base de données appelée amr (évidemment il y a).

Si je change (last__iexact=last_name) en (last__icontains=last_name) alors en laissant le nom de famille vide fonctionne bien et amr est trouvé.

Mais avec last__icontains=last_name si vous recherchez "collin" vous obtenez également "collins" et "collingwood" ce qui n'est pas ce que je veux. Savez-vous comment je peux utiliser iexact et si elle est ignorée si elle est vide?

Merci

C'est la fonction de vue:

def search_form(request): 
    if request.method == 'POST': 
     search_form = SearchForm(request.POST) 
     if search_form.is_valid(): 
      last_name = search_form.cleaned_data['last_name'] 
      first_name = search_form.cleaned_data['first_name'] 
      lawyers = Lawyer.objects.filter(last__iexact=last_name).filter(first__icontains=first_name) 
      if len(lawyers)==0: 
       form = SearchForm() 
       return render_to_response('not_in_database.html', {'last': last_name, 'first': first_name, 'form': form}) 
      if len(lawyers)>1: 
       form = SearchForm(initial={'last_name': last_name}) 
       return render_to_response('more_than_1_match.html', {'lawyers': lawyers, 'last': last_name, 'first': first_name, 'form': form}) 
      q_school = Lawyer.objects.filter(last__icontains=last_name).filter(first__icontains=first_name).values_list('school', flat=True) 
      q_year = Lawyer.objects.filter(last__icontains=last_name).filter(first__icontains=first_name).values_list('year_graduated', flat=True) 
      lawyers1 = Lawyer.objects.filter(school__iexact=q_school[0]).filter(year_graduated__icontains=q_year[0]).exclude(last__icontains=last_name) 
      form = SearchForm() 
      return render_to_response('search_results.html', {'lawyers': lawyers1, 'last': last_name, 'first': first_name, 'form': form}) 
    else: 
     form = SearchForm() 
     return render_to_response('search_form.html', {'form': form, }) 

Répondre

4

Vous ne devez pas construire le QuerySet en une seule fois.

lawyers = Lawyer.objects.all() 
if last_name: 
    lawyers = lawyers.filter(last__iexact=last_name) 
if first_name: 
    lawyers = lawyers.filter(first__icontains=first_name) 

Django n'évaluer la QuerySet jusqu'à ce qu'il doit (dans ce cas, les forces d'appel len() à évaluer), de sorte que vous pouvez garder les filtres d'empilage tous les jours jusqu'à ce que vous êtes longtemps prêt à Exécutez la requête.

http://docs.djangoproject.com/en/dev/ref/models/querysets/#when-querysets-are-evaluated

De plus, vous n'avez pas besoin de créer de nouvelles QuerySets plus tard, vous pouvez simplement utiliser l'existant.

q_school = Lawyer.objects.filter(last__icontains=last_name).filter(first__icontains=first_name).values_list('school', flat=True) 
q_year = Lawyer.objects.filter(last__icontains=last_name).filter(first__icontains=first_name).values_list('year_graduated', flat=True) 

Peut-être:

q_school = lawyers.values_list('school', flat=True) 
q_year = lawyers.values_list('year_graduated', flat=True) 
+0

Great! Je vous remercie. J'ai réparé la première partie et ça marche maintenant. Je regarderai l'autre plus tard. J'aurai aussi une question de modèle. Merci encore. – Zeynel