Django

2011-10-06 9 views
15

में पूरा नाम पूछताछ मैं Django में पूरा नाम कैसे पूछ सकता हूं?Django

स्पष्ट करने के लिए, मैं अनिवार्य रूप से एक अस्थायी स्तंभ बनाने करना चाहते हैं, first_name के संयोजन और एक पूरा नाम देने के लिए LAST_NAME, तो एक तरह उस पर है, तो कैसा लगा:

select [fields] from Users where CONCAT(first_name, ' ', last_name) LIKE '%John Smith%"; 

ऊपर क्वेरी सभी उपयोगकर्ताओं वापसी होगी जॉन स्मिथ नाम दिया। यदि संभव हो तो मैं कच्चे SQL कॉल का उपयोग करने से बचना चाहता हूं।

मैं जिस मॉडल के बारे में बात कर रहा हूं वह स्टॉक django.contrib.auth.models उपयोगकर्ता मॉडल है। सीधे मॉडल में बदलाव करना कोई समस्या नहीं है।

उदाहरण के लिए, यदि कोई उपयोगकर्ता 'जॉन पॉल स्मिथ' खोजना चाहता था, तो इसे 'जॉन पॉल' के पहले नाम और अंतिम नाम 'स्मिथ' के साथ-साथ पहले नाम 'जॉन' वाले उपयोगकर्ताओं से मेल खाना चाहिए। और अंतिम नाम 'पॉल स्मिथ'।

+0

कृपया अपने Django मॉडल शामिल करें। यदि आप एक "व्युत्पन्न मूल्य" चाहते हैं (जैसे कि 'CONCAT (first_name,' ', last_name)' एसक्यूएल में) तो आपको इसे मॉडल में जोड़ना होगा। इसलिए, अपने प्रश्न में मॉडल शामिल करें। –

+0

क्या आप जानते हैं, बीटीडब्ल्यू, कि 'CONCAT (first_name,' ', last_name) जैसे'% जॉन स्मिथ% '' बहुत अक्षम है? 'First_name LIKE'% जॉन 'का उपयोग करके और अंतिम_नाम जैसे' स्मिथ% '' अधिक कुशल हो सकता है ऐसा करने के लिए गैर-CONCAT तरीके होने पर आप CONCAT का उपयोग क्यों करते हैं? –

+0

यह मानक django.contrib.auth.models उपयोगकर्ता मॉडल है। हम पहले से ही इस मॉडल में फ़ील्ड जोड़ रहे हैं/बदल रहे हैं, इसलिए संशोधन एक नहीं हैं समस्या। –

उत्तर

5

जब तक मैं कुछ याद कर रहा हूँ, तुम इतनी तरह अपने डीबी क्वेरी करने के लिए अजगर का उपयोग कर सकते हैं:

from django.contrib.auth.models import User 
x = User.objects.filter(first_name='John', last_name='Smith') 

संपादित करें: आपके प्रश्न का उत्तर करने के लिए:

आप वापस जाने के लिए की जरूरत है 'जॉन पॉल स्मिथ 'जब उपयोगकर्ता' जॉन स्मिथ 'की खोज करता है तो आप' contains 'का उपयोग कर सकते हैं जो SQL LIKE में अनुवाद करता है। यदि आपको केवल 'जॉन पॉल' नाम को स्टोर करने की क्षमता की आवश्यकता है, तो दोनों नाम पहले_नाम कॉलम में रखें।

User.objects.filter(first_name__contains='John', last_name__contains='Smith') 

इस तब्दील करने के लिए:

SELECT * FROM USERS 
WHERE first_name LIKE'%John%' 
AND last_name LIKE'%Smith%' 
+1

क्या होता है यदि क्वेरी "जॉन पॉल स्मिथ" है? –

+0

यदि first_name == "जॉन पॉल" या last_name == "पॉल स्मिथ", यह अभी भी इस तरह से मेल खाता है। – jdi

+0

मैं क्या कह रहा हूं, क्या होगा यदि उपयोगकर्ता जॉन पॉल स्मिथ में टाइप किया गया हो? –

4
class User(models.Model): 
    first_name = models.CharField(max_length=64) 
    last_name = models.CharField(max_length=64) 
    full_name = models.CharField(max_length=128) 
    def save(self, *args, **kw): 
     self.full_name = '{0} {1}'.format(first_name, last_name) 
     super(User, self).save(*args, **kw) 
9

आसान:

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 

कहाँ query_name "जॉन स्मिथ" हो सकता है (लेकिन यह भी किसी भी अगर उपयोगकर्ता स्मिथ जॉन को पुनः प्राप्त होगा)।

+0

मैंने इसका उपयोग करना शुरू कर दिया है और जैसे ही एक से अधिक खोज शब्द हैं, http प्रतिक्रिया समय 100ms से 5seconds तक जाता है। कोई विचार यह क्यों होगा? – abarax

+0

आपको यह तय करना होगा कि पहले समस्या कहां है। डेटाबेस? ORM? खाका? यह देखने के लिए कि समस्या डीबी में है या नहीं, एक SQL क्लाइंट में क्वेरी ('q .query') क्वेरी निष्पादित करें। यदि नहीं, बहिष्करण (कोड के टुकड़े को हटाकर) द्वारा, अनुमान लगाने का प्रयास करें कि यह टेम्पलेट में है या नहीं। यदि नहीं, तो यह ओआरएम पर हो सकता है (कम पंक्तियों को लौटने वाले प्रश्नों का प्रयास करें)। आपको ओआरएम एन + 1 समस्या का सामना करना पड़ रहा है (इसे 'select_related' और' prefetch_related' 'के साथ ठीक करें)। क्या आप क्वेरी के साथ EXPLAIN (mysql/postgres) का उपयोग कर कुछ गलत अनुमान लगा सकते हैं (एक एसक्यूएल क्लाइंट से)? क्या आप बड़े पैमाने पर टेबल हैं? यदि हां, तो क्या पहले_नाम और last_name अनुक्रमणित करना समस्या को कम करता है? – laffuste

+0

सुझावों के लिए धन्यवाद – abarax

0

क्या इस बारे में:

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

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

users = set(users) 

की कोशिश की और परीक्षण किया!