我想在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,标题,作者或标签包含关键字中的任何单词。
答案 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