@denismatveyev7

Django — реализация поиска объектов?

Добрый день!

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

Спасибо!
  • Вопрос задан
  • 823 просмотра
Пригласить эксперта
Ответы на вопрос 2
Mr_Floppy
@Mr_Floppy
Примерно так:
filters = Q()

for word in keywords.split(','):
                filters |= Q(keywords__icontains=word)

Item.objects.filter(filters)
Ответ написан
sim3x
@sim3x
models.py

    class Location(models.Model):
        user = models.ForeignKey(User)
        name = models.CharField(max_length=100)
        keywords = models.ManyToMany(Keyword)

    class Keyword(models.Model):
        name = models.CharField(max_length=100)
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы