Django: Фильтрация на связанном объекте, удаляя дубликаты из результата

Учитывая следующие модели:

class Blog(models.Model):
    name = models.CharField()

class Entry(models.Model):
    blog = models.ForeignKey(Blog)
    content = models.CharField()

Я надеюсь передавать следующее шаблону:

blogs  = Blog.objects.filter(entry__content__contains = 'foo')
result = [(blog, blog.entry_set.filter(content__contains = 'foo'))
          for blog in blogs]
render_to_response('my.tmpl', {'result': result}

Однако "Blog.objects.filter (...)" возвращает тот же объект Блога многократно, если больше чем одна запись соответствия найдена.

Как Вы удаляете дубликаты? Или еще лучше, я пропускаю более простой способ передать список соответствий к шаблонам?

10
задан knipknap 30 December 2009 в 12:15
поделиться

2 ответа

Добавление .distinct() даст вам только четкие результаты.

.
18
ответ дан 3 December 2019 в 16:10
поделиться

См. QuerySet API Docs для функции "distinct()":

Returnns a new QuerySet that use SELECT DISTINCT в своем SQL-запросе. Этот исключает дублирующие строки из результаты запроса.

По умолчанию QuerySet не будет устранить дублирующие ряды. На практике, это редко бывает проблемой, потому что простые запросы, такие как Blog.objects.all() не вводит параметр возможность дублирования строк результата. Однако, если ваш запрос охватывает несколько таблицы, можно получить дубликаты результаты, когда оценивается QuerySet. Именно тогда вы бы использовали clear().

8
ответ дан 3 December 2019 в 16:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: