Django查询以获取关键字集包含在搜索字符串中的所有广告
我试图在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
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。所以,答案不是非常接近正确,它是完全正确的。再次感谢。