2013-10-07 8 views
6

एक बुलीयन मूल्य द्वारा SearchQuerySet फ़िल्टर करने का प्रयास करना मेरे लिए काम नहीं करता है। (मैं जबकि परीक्षण प्रदान की "सरल" बैकएंड खोज इंजन का उपयोग कर रहा हूँ।)Django Haystack - एक बुलियन क्षेत्र द्वारा खोज परिणामों को फ़िल्टर करने के लिए कैसे?

मैं की तरह एक सूचकांक है:

class MyIndex(indexes.SearchIndex, indexes.Indexable): 
    text = indexes.CharField(document=True, use_template=True) 
    has_been_sent = indexes.BooleanField(model_attr='has_been_sent') 
    # other fields 

    def get_model(self): 
     return MyModel 

और मैं खोज के लिए एक कस्टम फार्म का उपयोग करें:

BOOLEAN_OPTIONS = [ ('either', 'Either'), ('yes', 'Yes'), ('no', 'No') ] 

class MyModelSearchForm(SearchForm): 
    # other fields 
    has_been_sent = forms.ChoiceField(widget = forms.Select(), label = 'Sent?', choices=BOOLEAN_OPTIONS) 

def search(self): 
    sqs = super(MyModelSearchForm, self).search() 

    if not self.is_valid(): return self.no_query_found() 

    sqs = sqs.models(MyModel) # cuts out other models from the search results 
    if self.cleaned_data['has_been_sent'] != 'either': 
     if self.cleaned_data['has_been_sent'] == 'yes': sent = True 
     else: sent = False 
     sqs = sqs.filter(has_been_sent=sent) 

    return sqs 

यदि मैंने है_बीन_सेंट विकल्प को फॉर्म में हां या नहीं सेट किया है, तो मुझे हमेशा 0 परिणाम मिलते हैं, जो स्पष्ट रूप से गलत है। मैंने बिना भाग्य के खोल में भी कोशिश की है। sqs.filter(has_been_sent=True) और sqs.filter(has_been_sent=False) दोनों एक खाली सूची लौटाते हैं, फिर भी sqs.values('has_been_sent') स्पष्ट रूप से has_been_sent के लिए ट्रू मानों के साथ रिकॉर्ड का एक समूह दिखाता है। और यहां तक ​​कि अजनबी, sqs.filter(has_been_sent='t') 'एफ', 'ए', और 'जे' जैसे असंबंधित अक्षरों के साथ रिकॉर्ड का एक सबसेट देता है! मैं कुल नुकसान पर हूँ। क्या किसी को हेस्टैक के साथ इस तरह की समस्या का अनुभव है?

संबंधित नोट पर, वे फ़ील्ड हैं जिन्हें आप इंडेक्स फ़ील्ड (search_indexes.py में) या मॉडल फ़ील्ड (उनके संबंधित मॉडल.py में) से SearchQuerySet().filter() के माध्यम से फ़िल्टर करते हैं?

संपादित करें:

मैं Django के manage.py खोल के माध्यम से अपने फ़िल्टर का परीक्षण करने का प्रयास किया है, लेकिन मुझे लगता है कि मैं गलत कर रहा हूँ। ऐसा लगता है कि यह मेरी search_indexes.py का पालन नहीं कर रहा है, क्योंकि मैंने इसे MyModel के उप-समूह में index_queryset() विधि के साथ सीमित कर दिया है, लेकिन मुझे खोल में MyModel की सभी ऑब्जेक्ट मिलती हैं।

>>> from haystack.query import SearchQuerySet 
>>> from myapp.models import MyModel 
>>> sqs = SearchQuerySet().models(MyModel) 

और फिर कुछ परीक्षण:

>>> len(sqs) # SHOULD be 5, due to the index_queryset() method I defined in search_indexes.py 
17794 
>>> sqs.filter(has_been_sent='true') # Same happens for True, 'TRUE', and all forms of false 
[] 
>>> len(sqs.filter(not_a_real_field='g')) # Made-up filter field, returns a subset somehow?? 
2591 
>>> len(sqs.filter(has_been_sent='t')) 
3621 
>>> len(sqs.filter(has_been_sent='f')) 
2812 

क्योंकि मैं एक सबसेट जब नकली मैदान पर छानने मिलता है, मुझे नहीं लगता कि यह मेरे फिल्टर क्षेत्रों में से एक के रूप में has_been_sent पहचानने है या नहीं। खासकर जब से 'टी' और 'एफ' के परिणाम कुल तक नहीं जुड़ते हैं, जो इसे चाहिए, क्योंकि सभी रिकॉर्ड्स के लिए उस बुलियन फ़ील्ड की आवश्यकता होती है। क्या मुझे अपने परीक्षण में एक कदम याद आ रहा है? एक स्ट्रिंग true या false क्वेरी में के रूप में फिल्टर करने के लिए

उत्तर

1

ऐसा प्रतीत होता है कि समस्या सरल बैकएंड में थी। मैंने हेस्टैक को हूशैक पर स्थापित और स्विच किया, और यह समस्या साफ़ हो गई। (अब SearchQuerySet()। मॉडल() काम नहीं करता है, लेकिन यह स्पष्ट रूप से हैस्टैक + हूश के साथ एक दस्तावेज बग है।)

संपादित करें: हुओश के साथ और अधिक परेशानी के कारण, मैंने अपने बैकएंड के रूप में सोलर 4.5.1 का उपयोग करने के लिए स्विच किया । सब कुछ अब उम्मीद के रूप में काम कर रहा है।

6

प्रयास करें, यह भूसे के ढेर में ज्ञात सीमा से किया गया है और मैं बजाय करने का, यकीन है कि अगर यह तय हो गई है नहीं कर रहा हूँ:

sqs.filter(has_been_sent=True) 

यह करें:

sqs.filter(has_been_sent='true') # true or false in lowercase 

पुनश्च जब आप SearchQuerySet().filter() आप search_indexes.py फाइल में परिभाषित क्षेत्रों के आधार पर फ़िल्टर।

+0

हम्म। मुझे अभी भी 'सत्य' और 'झूठी' के साथ एक खाली परिणाम मिलता है। मुझे लगता है कि मुझे manage.py shell गलत के माध्यम से परीक्षण करना होगा। मैंने अपनी मुख्य पोस्ट को संपादित करने के लिए संपादित किया है कि मैं कैसे परीक्षण कर रहा हूं। मुझे लगता है कि मैंने एक कदम याद किया होगा। – Goluxas

+0

मैं आपको मॉडल में या 'search_indexes.py' फ़ाइल में बूलियन फ़ील्ड के लिए डिफ़ॉल्ट मान जोड़ने का सुझाव दूंगा, फिर आदेशों को पुनर्निर्माण_इंडेक्स और अपडेट_इंडेक्स को सम्मानपूर्वक चलाएं और जैसा कि मैंने सुझाव दिया है, फिर से परीक्षण करें। –

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