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'
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) ищет сравнение например “спам,хам” с “еггс,хам,спам”. А надо, что бы взяло “спам” и найдя его в “еггс,хам,спам” вернуло этот объект.
Спасибо!