Вопрос по django-1.4, django – Фильтр prefetch_related в Django

16

Есть ли способ фильтрации предварительно выбранных объектов? Мне нужно получить последний () из предварительно выбранных объектов, но prefetch_related не работает, если вы используете последний, потому что запрос изменился?

Пример, приведенный здесь, делает то, что мне нужно, но я надеялся, что есть более простой обходной путь ...

https://github.com/ionelmc/django-prefetch#example

Ваш Ответ

3   ответа
13

возможна фильтрация предварительно выбранных объектов. Увидетьэтот так ответ, а такжедокументация по Django.

4

который вряд ли сравним с этим приложением, но надеюсь, вы найдете его полезным:

class Author(models.Model):
    name = models.CharField(max_length=100)

    def latest_book(self):
        return max(self.book_set.all(), key=lambda book: book.created)

authors = Author.objects.prefetch_related('book_set')
authors[0].latest_book() #  what you wanted
Я проверил это, и, похоже, он генерирует те же запросы, что и простой цикл ... Я не думаю, что вы можете использовать select_related для обратной связи alan
Я извиняюсь - конечно, это должно быть prefetch_related (я отредактировал мой ответ). Использование этой дыры, установленной с all (), является предварительной выборкой, и итерирование не должно затрагивать базу данных.
2

authors=Author.objects.prefetch_related('book_set')

Если вы хотите фильтровать по атрибуту (имени), присутствующему в модели Author, вы можете просто отфильтровать его, написав:

authors.filter(name='your_value')

Но если вы хотите применить фильтр к модели Книги, вы должны написать следующее:

authors.filter(book__created__gt='your_date')

Это отфильтрует все книги, у которых дата создания (созданный атрибут в модуле Книги) больше вашей даты.

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