在Django中搜索多个值

时间:2019-04-28 16:05:03

标签: python django search filter

我想在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字段的模因。user字段是XYZ,标题,作者或标签包含关键字中的任何单词。

1 个答案:

答案 0 :(得分:0)

您需要的是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