Запрос количества слов в Django - PullRequest
1 голос
/ 16 ноября 2010

Учитывая модель с полями Boolean и TextField, я хочу сделать запрос, который находит записи, которые соответствуют некоторым критериям И имеют больше, чем «n» слов в TextField.Это возможно?например:

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)

но как я могу отфильтровать подмножество тех записей, где поле "заметки" имеет больше, скажем,, 25 слов?

Ответы [ 2 ]

5 голосов
/ 16 ноября 2010

Попробуйте:

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

Этот код использует метод набора запросов Django extra для добавления пользовательского предложения WHERE.Вычисление в предложении WHERE в основном подсчитывает вхождения символа «пробел», предполагая, что все слова имеют префикс только один пробел.Добавление одного к результату учитывает первое слово.

Конечно, это вычисление является лишь приближением к реальному количеству слов, поэтому, если оно должно быть точным, я бы сделал подсчет слов в Python.

3 голосов
/ 16 ноября 2010

Я не знаю, какой SQL нужно запустить для того, чтобы БД выполняла работу, а это действительно то, что нам нужно, но вы можете сделать это без проблем.

Создайте дополнительные поля с именем wordcount иличто-то, затем расширьте метод save и сделайте так, чтобы он считал все слова в примечаниях перед сохранением модели.

Цикл тривиален, и все еще нет никаких шансов, что эта денормализация данных прервется после сохраненияМетод всегда запускается при сохранении.

Но может быть, есть и лучший способ, но если все остальное не сработает, это то, что я бы сделал.

...