2012-01-25 17 views
6

Tek bir kullanıcı tablosundan tüm konuları alan bir django uygulamasına sahibim.django queryset - ad ve soyad için arama

all_soggs =  Entity.objects.filter(lastname__istartswith=request.GET['query_term']).order_by('lastname') 
if(all_soggs.count()==0): 
    all_soggs = Entity.objects.filter(firstname__istartswith=request.GET['query_term']).order_by('firstname') 

sorgu ilk firstname tarafından daha sonra lastname öğeleri eşleşen arayabilir ve görebileceğiniz gibi: Ben de, bir giriş arama formunu uyguladık bu gerçekleştirilen sorgusu olur. Bu, 'firstaname lastname' veya 'lastname firstname' ismini yazana kadar çalışır, bu durumda sonuç yoktur. Daha iyi bir arama yapmak için sorguyu nasıl değiştirebilirim?

teşekkürler - Luke

cevap

8

kopyala/yapıştır: Benzer https://stackoverflow.com/a/17361729/1297812

from django.db.models import Q 

def find_user_by_name(query_name): 
    qs = User.objects.all() 
    for term in query_name.split(): 
    qs = qs.filter(Q(first_name__icontains = term) | Q(last_name__icontains = term)) 
    return qs 
+1

zaten çözüldü (1 yıl önce). Neyse teşekkürler :-) – Luke

7

You need Q objects ve ayrıca (hayır ilk isim tam dize "Ad Soyad" maç olacak beri) ayrı terime Sorgunuzu bölmek gerekir.

"Ad Soyad" aramasında "Ad veya Soyad" ile başlayan ad ve soyadları eşleştirmek için bir fikir.

Bu genel bir aramadır - sorgunuzu özel gereksinimlerinize göre ayarlayın!

Düzeltme: oops, Çok kafa karıştırıcı göründüğü için azaltmayı kullanmaktan hoşlanmıyorum, ancak bunların birlikte ORed olması gerekiyor ve terimlerin sayısı bilinmediğinden daha ayrıntılı bir sürüm yapamıyoruz. dan

Entity.objects.filter(
    Q(first_name__istartswith="Firstname") | Q(last_name__istartswith="Firstname") | 
    Q(first_name__istartswith="Lastname") | Q(last_name__istartswith="Lastname") 
    ) 
0

import operator 
from django.db.models import Q 

search_args = [] 
for term in request.GET['query_term'].split(): 
    for query in ('first_name__istartswith', 'last_name__istartswith'): 
     search_args.append(Q(**{query: term})) 

all_soggs = Entity.objects.filter(reduce(operator.or_, search_args)) 

arama "Ad Soyad" önceki sorgunun eşittir verilen Q nesneleri nasıl kullanılacağını açıklamak için soru: Querying full name in Django

query = request.GET.get('query') 
entities = [] 

try: 
    firstname = query.split(' ')[0] 
    lastname = query.split(' ')[1] 
    entities += Entity.objects.filter(firstname__icontains=firstname,lastname__icontains=lastname) 
    entities += Entity.objects.filter(firstname__icontains=lastname,lastname__icontains=firstname) 

entities = set(entities) 
+0

Soruyu iki kez cevaplama ve kendi cevabınıza referans verme amacı nedir? –

+0

Yığın taşması kurallarına göre, bir bağlantıya başvuruyor olsanız bile tam bir cevap vermeniz gerekir, çünkü bağlantılar bozulabilir – atx