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 中,正确地制作具有多个类别、多个标签和搜索的查询集?

如何在 django 会话中存储查询集以进行分页

我想在 Django 中进行两个查询集搜索

Elasticsearch搜索关键字不进行分词

DateTimeField 查询集在 Django 中返回 None

Django ORM使用子查询按关键字搜索文本