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