Уведомления

Группа в Telegram: @pythonsu

#1 Май 29, 2016 13:53:25

Denzil
Зарегистрирован: 2015-12-24
Сообщения: 22
Репутация: +  0  -
Профиль   Отправить e-mail  

Реализация поиска объектов

Добрый день!

models.py

 class Location(models.Model):
        user = models.ForeignKey(User)
        name = models.CharField(max_length=100, verbose_name=u"Локация", default=u'')
        keywords = models.CharField(max_length=100, verbose_name=u"Ключевые слова")

forms.py

 class AdvancedSearchForm(forms.Form):
        location = forms.CharField()
        keywords = forms.CharField() # e.g. 'spam,eggs,hum'
views.py

class AdvancedSearchView(FormView):
        form_class = AdvancedSearchForm
        template_name = "advanced_search.html"
        success_url = '/search_location/result/'
     
    # url of this view is 'search_result'
    class SearchResultView(ListView):
        model = Location
        context_object_name = 'locations_searched'
        paginated_by = 5
        template_name = "search_result.html"
     
        def get_queryset(self):
            queryset = super(SearchResultView, self).get_queryset()
            location = self.request.GET.get('location')
            location = location.upper()
            keywords = self.request.GET.get('keywords')
            return queryset.filter(Q(name=location)|Q(keywords=keywords))

advanced_search.html

<form action="{% url 'search_result' %}" method="GET">{% csrf_token %}
           {{ form|crispy }}
           <button class="btn btn-default" type="submit">Find</button>
    </form>

search_result.html

 {% for location in locations_searched %}
           {{ location }}<br>
           {{ location.user }}<br>
           {{ location.keywords }}<br>
    {% endfor %}

Замысел такой - при создании объекта, ключевые слова сохраняются в базе как строка слов, разделенных запятыми.
При поиске объектов я также заполняю поле формы keywords словами, разделенными запятой.
Вопрос - как реализовать поиск соответствующих объектов по такому алгоритму - каждое слово введенное в форму должно искаться в каждом объекте (в поле keywords модели) и при совпадении хотя бы одного слова объект должен возвращаться.

P.S. как видно данная реализация Q(keywords=keywords) ищет сравнение например “спам,хам” с “еггс,хам,спам”. А надо, что бы взяло “спам” и найдя его в “еггс,хам,спам” вернуло этот объект.

Спасибо!

Офлайн

#2 Май 30, 2016 18:31:25

mirak
Зарегистрирован: 2016-02-24
Сообщения: 34
Репутация: +  0  -
Профиль   Отправить e-mail  

Реализация поиска объектов

Ну дык разделить строку по запятым и искать в цикле. Если я правильно понял, что требуется.

Офлайн

#3 Май 30, 2016 18:34:59

mirak
Зарегистрирован: 2016-02-24
Сообщения: 34
Репутация: +  0  -
Профиль   Отправить e-mail  

Реализация поиска объектов

В цикле можно только условия прописать, я точно не помню подходит ли Ку лукап здесь. Вам ведь нужно искать или, или. Потом одним запросом вытягивать кверисет.

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version