web-dev-qa-db-ja.com

Django

プリフェッチされたオブジェクトをフィルタリングする方法はありますか?プリフェッチされたオブジェクトのlatest()を取得する必要がありますが、クエリが変更されているため、latestを使用するとprefetch_relatedが機能しませんか?

ここの例は私が必要なことをしますが、もっと簡単な回避策があることを望んでいました...

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

19
alan

Django 1.7の時点で、プリフェッチされたオブジェクトのフィルタリングが可能です。 this SO answer 、および the Djangoドキュメント

15
Webthusiast

これは非常に単純な方法であり、これらのアプリとはほとんど比較できませんが、役立つことを願っています。

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
4
jasisz

はい、それはこの方法で行うことができます:

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

Authorモデルに存在する属性(名前)でフィルタリングする場合は、次のように記述して簡単にフィルタリングできます。

authors.filter(name='your_value')

ただし、Booksモデルにフィルターを適用する場合は、次のように記述する必要があります。

authors.filter(book__created__gt='your_date')

これにより、作成日(Bookモジュールのcreated属性)が日付よりも大きいすべての書籍がフィルタリングされます。

2
Manasvi Batra