Django查询以获取关键字集包含在搜索字符串中的所有广告
Posted
技术标签:
【中文标题】Django查询以获取关键字集包含在搜索字符串中的所有广告【英文标题】:Django query to get all ads whose keyword sets are contained by a search string 【发布时间】:2011-11-16 10:47:14 【问题描述】:我正在尝试在 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”的广告。任何帮助将不胜感激。
【问题讨论】:
【参考方案1】:我能想到的最简单的事情是获取关键字列表的补充——也就是说,在处理用户输入后,您在变量keywords
中有一个字符串列表,如['keyword1', 'keyword2', 'keyword3']
。然后你把所有不在该列表中的关键字:
disallowed_keywords = Keyword.objects.exclude(keyword_name__in=keywords)
然后,您不再寻找与您想要的关键字匹配的广告,而是排除与错误关键字匹配的广告:
Ad.objects.exclude(keyword__in=disallowed_keywords)
【讨论】:
这几乎是正确的。 disallowed_keywords 过滤器没有将 keyword_name__in=keywords 作为排除条款——我使用 pk__in=keywords 代替,它就像一个魅力。非常感谢!! 我需要更正我之前的评论。发布的解决方案就像我一直在使用文本搜索框一样工作,回答者可以理解地假设我正在这样做。由于它仍在开发中,我正在为我的搜索使用基于列表的关键字选择器,而不是文本框。这就是为什么我必须在过滤器中对 pk 进行更改。所以,答案不是很接近正确,它是完全正确的。再次感谢。以上是关于Django查询以获取关键字集包含在搜索字符串中的所有广告的主要内容,如果未能解决你的问题,请参考以下文章
在 Django 中,正确地制作具有多个类别、多个标签和搜索的查询集?