एक बुलीयन मूल्य द्वारा 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
क्वेरी में के रूप में फिल्टर करने के लिए
हम्म। मुझे अभी भी 'सत्य' और 'झूठी' के साथ एक खाली परिणाम मिलता है। मुझे लगता है कि मुझे manage.py shell गलत के माध्यम से परीक्षण करना होगा। मैंने अपनी मुख्य पोस्ट को संपादित करने के लिए संपादित किया है कि मैं कैसे परीक्षण कर रहा हूं। मुझे लगता है कि मैंने एक कदम याद किया होगा। – Goluxas
मैं आपको मॉडल में या 'search_indexes.py' फ़ाइल में बूलियन फ़ील्ड के लिए डिफ़ॉल्ट मान जोड़ने का सुझाव दूंगा, फिर आदेशों को पुनर्निर्माण_इंडेक्स और अपडेट_इंडेक्स को सम्मानपूर्वक चलाएं और जैसा कि मैंने सुझाव दिया है, फिर से परीक्षण करें। –