代码之家  ›  专栏  ›  技术社区  ›  shacker kravietz

Django中的字数查询

  •  1
  • shacker kravietz  · 技术社区  · 14 年前

    给定一个同时包含Boolean和TextField字段的模型,我想做一个查询,查找符合某些条件并且在TextField中有超过“n”个单词的记录。这可能吗?e、 .g.:

    class Item(models.Model):
    
        ...    
        notes = models.TextField(blank=True,)
        has_media = models.BooleanField(default=False)
        completed = models.BooleanField(default=False)
        ...
    

    这很简单:

    items = Item.objects.filter(completed=True,has_media=True)
    

    但是,如果“notes”字段的字数超过25个字,那么如何筛选这些记录的子集呢?

    2 回复  |  直到 14 年前
        1
  •  5
  •   Benjamin Wohlwend    14 年前

    试试这个:

    Item.objects.extra(where=["LENGTH(notes) - LENGTH(REPLACE(notes, ' ', ''))+1 > %s"], params=[25])
    

    此代码使用Django的 extra 用于添加自定义项的queryset方法 WHERE 条款。中的计算 哪里 子句基本上计算“空格”字符的出现次数,假设所有单词的前缀都正好是一个空格字符。在结果中加上一个代表第一个单词。

    当然,这个计算只是对实际单词计数的近似,所以如果必须精确的话,我会用Python做单词计数。

        2
  •  3
  •   Mathias Nielsen    14 年前

    我不知道需要运行什么SQL才能让DB完成这项工作,这确实是我们想要的,但是您可以对它进行修改。

    创建一个名为wordcount或其他的额外字段,然后扩展save方法,并在保存模型之前让它计算notes中的所有单词。

    循环是很简单的,而且由于save方法总是在save上运行,所以这种数据的非规范化仍然不可能中断。

    但也许有更好的办法,但如果其他办法都失败了,我会这样做。