Django 1.8:加入最新的外键入口

时间:2017-04-13 18:49:08

标签: python mysql django join

假设我有一个简单的模型(借用django docs):

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')

这会导致每位作者额外查询。似乎最新的无法使用预取的查询集来确定。

欣赏任何方向。

1 个答案:

答案 0 :(得分:0)

我能够通过明确定义预取查询集来获得每个作者的最新书籍来解决这个问题。这允许我使用.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]