Поиск с несколькими значениями в Django - PullRequest
1 голос
/ 28 апреля 2019

Я хочу создать простой поиск в Django. Я хочу найти все объекты, в которых любое слово из массива ключевых слов находится в meme.title или meme.author или meme.tags, а user.request - в meme.user.

from django.db import models
from django.conf import settings

User = settings.AUTH_USER_MODEL

class Meme(models.Model):
    user = models.ForeignKey(User, on_delete='CASCADE')
    title = models.CharField(max_length=100)
    description = models.TextField(null=True,
                         blank=True, max_length=1000)
    author = models.CharField(max_length=100)
    page_link = models.TextField(blank=True, max_length=500)
    img_link = models.TextField(max_length=1000)
    tags = models.CharField(max_length=100)

    def __str__(self):
        return self.title

Например, если у меня есть ключевые слова = ['funny', 'old', 'black_humor'] и текущий пользователь XYZ, я хочу найти все мемы, которые имеют это поле meme.user XYZ и заголовок, автор или теги содержат любое слово из ключевых слов.

1 Ответ

0 голосов
/ 28 апреля 2019

Вам нужен объект Q.По умолчанию, если вы используете filter и цепочку нескольких аргументов, будет использоваться логика AND.Для более сложного запроса, такого как цепочка AND, вам нужно использовать Q. Таким образом, ваш набор запросов должен выглядеть следующим образом:

from django.db.models import Q
#get the current_user
current_user = request.user
keywords=  ['funny', 'old', 'black_humor']
qs = [Q(title__icontains=keyword)|Q(author__icontains=keyword)|Q(tags__icontains=keyword) for keyword in keywords]

query = qs.pop() #get the first element

for q in qs:
    query |= q
filtered_user_meme = Meme.objects.filter(query, user=current_user)

Дополнительная информация по объектам Q: https://docs.djangoproject.com/en/2.2/topics/db/queries/#complex-lookups-with-q-objects

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...