散装外键的最后一个对象 - Django

时间:2016-02-11 05:32:31

标签: python django

我有两种模式:

class Author(models.Model):
    name = models.CharField(max_length=30)
    age = models.CharField(max_length=40)

class Book(models.Model):
    title = models.CharField(max_length=100)
    author = models.ForeignKey(Author)
    publication_date = models.DateField()

我需要查找10年前列出的作者的最新着作:

[(author1.name, book32.title), (author5.name, book75.title), ...]

我能做到:

books = []
authors = Author.objects.filter(age=10)
books = [(a.name, a.book_set.last().title) for a in authors]

但它的工作时间太长了。 我怎么能完全通过ORM和数据库来做到这一点?

2 个答案:

答案 0 :(得分:0)

您可以使用prefetch_related。它不会对相关项进行第二次查询。

Author.objects.filter(age=10).prefetch_related('book_set')

另一方面,请使用IntegerField代替年龄(如果您只存储年龄)。对于此类查询,它会更有效,您还可以进行查询以获取所有非成人作者:

child_authors = Author.objects.filter(age__lt=18)

答案 1 :(得分:0)

首先,您的age字段应为IntegerField

age = models.IntegerField(max_length = 3)

如果你想要最后一个,让我们说,每10年作者的3本书你可以这样查询:

 ten_years_authors = Author.ojects.filter(age=10)
 ten_years_authors_and_their_last_books = ten_year_authors.select_related('book_set')[:3]