2012-01-25 11 views
6

मेरे पास एक django ऐप है जो उपयोगकर्ताओं की एक तालिका से सभी विषयों को पुनर्प्राप्त करता है।django queryset - firstname और lastname के लिए खोज

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') 

के रूप में आप देख सकते हैं क्वेरी पहले firstname द्वारा उपनाम से मेल खाने वाले आइटमों के लिए खोज, और उसके बाद: मैं भी, एक इनपुट खोज प्रपत्र को क्रियान्वित किया है इस क्वेरी प्रदर्शन किया है। यह तब तक काम करता है जब तक कि मैं पूरा नाम 'firstaname lastname' या 'lastname firstname' पूरा नहीं करता, इस मामले में कोई परिणाम नहीं है। बेहतर खोज करने के लिए मैं क्वेरी को कैसे संशोधित कर सकता हूं?

धन्यवाद - ल्यूक

उत्तर

8

कॉपी/पेस्ट: 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

पहले ही हल हो चुका है (1 साल से अधिक पहले)। वैसे भी धन्यवाद :-) – Luke

7

You need Q objects और आप भी अलग-अलग शर्तों में अपनी क्वेरी विभाजित करने के लिए (के बाद से कोई पहला नाम पूर्ण स्ट्रिंग "FIRSTNAME LASTNAME" से मेल खाएगी) की जरूरत है।

"फर्स्टनाम अंतिम नाम" खोज में "फर्स्टनाम" या "अंतिम नाम" से शुरू होने वाले किसी भी पहले या अंतिम नाम से मेल खाने का विचार यहां दिया गया है।

यह एक सामान्य खोज है - अपनी विशिष्ट आवश्यकताओं के अनुरूप क्वेरी समायोजित करें!

संपादित करें: ओह, मुझे वास्तव में कम करने का उपयोग करना पसंद नहीं है क्योंकि यह भ्रमित लग रहा है, लेकिन इन्हें एक साथ ऑर्डर करने की आवश्यकता है और हम अधिक वर्बोज़ संस्करण नहीं कर सकते क्योंकि शब्दों की संख्या अज्ञात है।

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)) 

स्पष्ट करने के लिए कैसे क्यू वस्तुओं का उपयोग करने के लिए, खोज "FIRSTNAME LASTNAME" पिछली क्वेरी के बराबर है दिया: से

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

इसी प्रकार प्रश्न: 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

प्रश्न का उत्तर दो बार और अपने उत्तर का संदर्भ देने का क्या मतलब है? –

+0

स्टैक ओवरफ़्लो के नियमों के मुताबिक आपको एक पूर्ण संदर्भ देना होगा भले ही आप एक लिंक का संदर्भ दे रहे हों, क्योंकि लिंक तोड़ सकते हैं – atx

संबंधित मुद्दे