1

给定一个具有布尔值和 TextField 字段的模型,我想做一个查询来查找符合某些条件并且在 TextField 中有超过“n”个单词的记录。这可能吗?例如。:

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个单词的那些记录的子集?

4

2 回答 2

6

尝试这个:

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

此代码使用 Django 的extraqueryset 方法添加自定义WHERE子句。子句中的计算WHERE基本上计算了“空格”字符的出现次数,假设所有单词都以一个空格字符为前缀。在结果中添加一个占第一个单词。

当然,这个计算只是对实际字数的一个近似值,所以如果它必须精确,我会在 Python 中进行字数统计。

于 2010-11-16T08:54:32.320 回答
3

我不知道需要运行什么 SQL 才能让数据库完成工作,这确实是我们想要的,但您可以对其进行修补。

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

循环是微不足道的,并且由于保存方法总是在保存时运行,因此这种数据的非规范化仍然没有机会中断。

但可能有更好的方法,但如果一切都失败了,这就是我会做的。

于 2010-11-16T08:49:15.233 回答