代码之家  ›  专栏  ›  技术社区  ›  Amine Messaoudi

django搜索不能处理超过2个字段

  •  1
  • Amine Messaoudi  · 技术社区  · 7 年前

    我有一个使用django的blog应用程序,有以下模型

    class Category(models.Model):
    
        id=models.AutoField(primary_key=True)
        title=models.CharField(unique=True,max_length=30,null=False,blank=False)
    
    class Article(models.Model):
    
        id=models.AutoField(primary_key=True)
        title=models.CharField(max_length=100,null=False,blank=False)
        category=models.ForeignKey(Category,null=False,blank=False)
        summary=models.CharField(null=False,blank=False,max_length=400)
        content = models.TextField(null=False, blank=False)
    
    class Comment(models.Model):
    
        id=models.AutoField(primary_key=True)
        article=models.ForeignKey(Article,null=False,blank=False)
        visitor_name=models.CharField(max_length=50,null=False,blank=False)
        content=models.TextField(null=False,blank=False)
    

    在管理区域,我试图实现一个搜索引擎,允许管理员使用多个字段搜索评论。

    我正在使用以下代码:

    all_queries = None
    keywords=''
    search_fields = ('visitor_name','content','article__title','article__resume','article__category__title','article__content')
    for keyword in keywords.split(' '):
        keyword_query = None
            for field in search_fields:
                each_query = Q(**{field + '__icontains': keyword})
                if not keyword_query:
                    keyword_query = each_query
                else:
                    keyword_query = keyword_query | each_query
                    if not all_queries:
                        all_queries = keyword_query
                    else:
                        all_queries = all_queries & keyword_query
    
    comments = Comment.objects.filter(all_queries).distinct().order_by('-date')
    

    我遇到的问题是这一行:

    search_fields = ('visitor_name','content','article__title','article__resume','article__category__title','article__content')
    

    例如这一行:

    search_fields = ('visitor_name','content')
    

    工作非常好,因为它正好有两个搜索字段。

    如果我只向数组中添加一个字段,它将不起作用

    1 回复  |  直到 7 年前
        1
  •  0
  •   Will Keeling    7 年前

    我认为你的逻辑有个小错误。你想而且( &

    降低生成代码的缩进级别 all_queries :

    all_queries = None
    keywords=''
    search_fields = ('visitor_name','content','article__title','article__resume','article__category__title','article__content')
    for keyword in keywords.split(' '):
        keyword_query = None
        for field in search_fields:
            each_query = Q(**{field + '__icontains': keyword})
            if not keyword_query:
                keyword_query = each_query
            else:
                keyword_query = keyword_query | each_query
    
        # You only want to do this for each keyword
        if not all_queries:
            all_queries = keyword_query
        else:
            all_queries = all_queries & keyword_query
    
    comments = Comment.objects.filter(all_queries).distinct().order_by('-date')