【问题标题】:Searching with multiple values in django在 django 中搜索多个值
【发布时间】:2019-09-17 09:53:21
【问题描述】:

我想在 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 并且标题、作者或标签包含的模因关键字中的任何单词。

【问题讨论】:

    标签: python django search filter


    【解决方案1】:

    你需要的是一个 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

    【讨论】:

    • 谢谢,太棒了。但是你必须改变一些事情。 qs = [Q(title_icontains=keyword)|Q(author_icontains=keyword)|Q(tags_icontains=keyword) for keyword in keywords] 应该是:qs = [Q(title__icontains=keyword)|Q(author__icontains=keyword)|Q(tags__icontains=keyword) for keyword in keywords]filtered_user_meme = Meme.objects.filter(user=current_user, query) 应该是:filtered_user_meme = Meme.objects.filter(query, user=current_user) 还要删除最后一行的')'
    猜你喜欢
    • 2017-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-05
    相关资源
    最近更新 更多