2013-02-21 33 views
8

मैं एक Django क्वेरी लिखने की कोशिश कर रहा हूं जो केवल पूरे शब्दों से मेल खाएगा। जवाब here आधार पर, मैं की तरह कुछ की कोशिश की है:केवल Django क्वेरी में पूरे शब्द मिलान

result = Model.objects.filter(text__iregex='\bsomeWord\b') 

लेकिन यह अपेक्षित परिणाम नहीं लौटा रहा है। मैंने

result = Model.objects.filter(text__iregex=r'\bsomeWord\b') 

का कोई फायदा नहीं हुआ।

result = Model.objects.filter(text__iregex=r'\b'+stringVariable+r'\b') 

या

result = Model.objects.filter(text__iregex=r'\b %s \b'%stringVariable) 

लेकिन अभी मैं भी यह एक कच्चे तार के साथ काम करने के लिए नहीं मिल सकता है: मेरा अंतिम लक्ष्य एक स्ट्रिंग चर में पारित करने के लिए और साथ ही, जैसे कुछ सक्षम होने के लिए है । मैं PostgreSQL का उपयोग कर रहा हूँ।

+0

आप किस डेटाबेस का उपयोग कर रहे हैं? – Matt

+0

@ मैटस्टवेन्स, मैं PostgreSQL का उपयोग कर रहा हूं। – GChorn

उत्तर

11

उपयोग "\ y" के बदले "\ b" जब आप PostgreSQL का उपयोग कर रहे, इस वजह Django आपका रेगुलर एक्सप्रेशन से गुजरता सीधे PostgreSQL के लिए नीचे है - तो अपने रेगुलर एक्सप्रेशन से की जरूरत को इससे संगत होने के लिए। आप बिना किसी समस्या के psql से उन्हें निष्पादित करने में सक्षम होना चाहिए।

result = Model.objects.filter(text__iregex=r"\y{0}\y".format(stringVariable)) 

देखें: http://bit.ly/ZtpojU

+1

वास्तव में '\ y' क्या है? –

+0

Django PostrereSQL नियमित अभिव्यक्तियों के लिए पीसीआरई का कोई अनुवाद नहीं करता है (देखें: http://bit.ly/ZtpbgH)। तो आपको केवल PostgreSQL के मूल नियमित अभिव्यक्तियों का उपयोग करना होगा, यहां देखें: http://bit.ly/ZtpojU – Matt

+0

यह काम करता है। '\ Y' के बारे में स्पष्टीकरण जोड़ने के लिए भी धन्यवाद। ''{0}' प्रारूप (स्ट्रिंगवारेबल) 'भाग के लिए, क्या यह'% s '% string लिखने का एक और तरीका है' अक्षम '? दोनों मेरे लिए काम करते प्रतीत होते हैं। – GChorn

1

आप regex छोड़ने और कुछ Django लुकअप

result = Model.objects.filter(Q(text__contains=' someword ') | 
           Q(text__contains=' someword.') | 
           Q(text__istartswith = 'someword.' | 
           Q(text__istartswith = 'someword.' | 
           Q(text__iendswith = 'someword') 

देख here डॉक्स के लिए का उपयोग करके कुछ प्राप्त करने में सक्षम हो सकता है।

मुझे एहसास है कि यह इतना सुरुचिपूर्ण नहीं है (लेकिन यदि आप रेगेक्स के प्रशंसक नहीं हैं तो आसान रखरखाव के लिए बनाता है)।

+1

क्योंकि यह पूरे शब्द मिलान नहीं करता है; उदाहरण के लिए, यदि मैं 'text__contains = 'tart' करता हूं तो मैं 'स्टार्ट' जैसे परिणाम उठाता हूं। – GChorn

+0

मेरा बुरा - मैं स्पष्ट रूप से यह जानने के लिए पर्याप्त एसक्यूएल से परिचित नहीं हूं कि 'पूरा शब्द मिलान' का अर्थ कुछ विशिष्ट था। वैसे भी, मैंने इसे थोड़ा सुधारने के लिए अपना जवाब अपडेट कर दिया है। –

+0

आसान रखरखाव? ऐसे कई मामले हैं जहां आप वहां शामिल नहीं हैं ('()', अल्पविराम, आदि के बीच)। –

0

मैं एक ही पर्ल-संगत एस्केप अनुक्रम \ ख का उपयोग कर शब्द सीमाओं से मेल करने की कोशिश कर समस्या थी। मेरा बैकएंड डेटाबेस MySQL है।

मैंने चरित्र वर्ग अभिव्यक्ति [[: space:]] द्वारा समस्या हल की, उदा।

 q_sum = Q() 
     search_list = self.form.cleaned_data['search_all'].split(' '); 
     for search_item in search_list: 
      search_regex = r"[[:space:]]%s[[:space:]]" % search_item 
      q_sum |= Q(message__iregex=search_regex) 
     queryset = BlogMessages.objects.filter(q_sum).distinct() 
+0

यह विराम चिह्न के लिए जिम्मेदार नहीं होगा, इसलिए आप जानते हैं। – yekta