2017-04-13 12 views
0

に最新のエントリに参加し、私は(Djangoのドキュメントから借用)単純なモデルがあるとします。ジャンゴ1.8:外部キー

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

class Book(models.Model): 
    name = models.CharField(max_length=300) 
    author = models.ForeignKey(Author) 
    pubdate = models.DateField() 

私は著者のリストと、それは可能です彼らの最新の本を、取得したいです著者には本がありません。私は生のクエリでこれを行うことができますが、それはORMの範囲内で効率的に行うことができます(つまり、データベースを繰り返し打つことなく)?

私が思い付くした最高のは、次のとおりです。

for a in Author.objects.prefetch_related('book_set'): 
    a.book_set.latest('pubdate') 

これは作者ごとに追加のクエリになります。先読みされたクエリーセットでは最新のものを判断できないようです。

いずれかの方向を気に入ってください。

答えて

0

プリフェッチクエリセットを明示的に定義して、各著者の最新の書籍を取得することで、これを解決できました。これにより、.all()を使用することができます。.all()には、最新の本(またはなし)のみが含まれ、別のクエリは発生しません。

latest_books = Book.objects.annotate(latest=Max('author__book__pubdate')).filter(pubdate=F('latest')) 

for a in Author.objects.prefetch_related(Prefetch('book_set', queryset=b_query)): 
    a.book_set.all()[0]