Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django查询以获取关键字集包含在搜索字符串中的所有广告_Django_Search_Django Models_Many To Many_Django Queryset - Fatal编程技术网

Django查询以获取关键字集包含在搜索字符串中的所有广告

Django查询以获取关键字集包含在搜索字符串中的所有广告,django,search,django-models,many-to-many,django-queryset,Django,Search,Django Models,Many To Many,Django Queryset,我试图在Django实现一个广告系统。我的广告模式如下: class Ad(models.Model): ... campaign = models.ForeignKey(Campaign) keyword = models.ManyToManyField(Keyword) def keystring(self): keys = self.keyword.all() keystring_value = "" for

我试图在Django实现一个广告系统。我的广告模式如下:

class Ad(models.Model):
    ...
    campaign = models.ForeignKey(Campaign)
    keyword = models.ManyToManyField(Keyword)

    def keystring(self):
        keys = self.keyword.all()
        keystring_value = ""
        for key in keys:
            keystring_value = keystring_value + key.keyword_name
        keystring_value = str(keystring_value)
        return (keystring_value)
    ...

这里的相关部分是关键字属性。它是与关键字对象主列表的多对多关系。因此,当用户搜索某组关键字时,比如“keyword1 keyword2 keyword3”,我希望所有具有以下关键字集的广告都返回:“keyword1 keyword2”、“keyword2 keyword3”、“keyword1”、“keyword1 keyword2 keyword3”等——搜索字符串包含关键字集的任何广告。我不希望搜索结果返回“关键字1关键字2关键字3关键字4”的广告。任何帮助都将不胜感激。

我能想到的最简单的事情是对你的关键字列表进行补充——也就是说,在处理用户输入后,你在变量
关键字
中有一个字符串列表,如
['keyword1','keyword2','keyword3']
。然后,选择列表中不包含的所有关键字:

disallowed_keywords = Keyword.objects.exclude(keyword_name__in=keywords)
然后,你不再寻找与你想要的关键词匹配的广告,而是排除那些与错误关键词匹配的广告:

Ad.objects.exclude(keyword__in=disallowed_keywords)

这几乎是正确的。不允许的\u关键字过滤器没有将关键字\u name\uuuu in=keywords作为排除子句——我使用了pk\uu in=keywords,它就像一个符咒一样工作。谢谢!!我需要更正我以前的评论。发布的解决方案会像我使用文本搜索框一样工作,回答者可以理解地认为我在这样做。由于它仍在开发中,我正在为我的搜索使用基于列表的关键字选择器,而不是文本框。这就是为什么我必须在过滤器中更改为pk。所以,答案不是非常接近正确,它是完全正确的。再次感谢。