Python bulk中外键的最后一个对象-Django

Python bulk中外键的最后一个对象-Django,python,django,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_da

我有两种型号:

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和数据库实现这一点?

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

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

另一方面,请使用IntegerField代替age(如果您仅以年为单位存储age)。这样的查询效率更高,您还可以进行查询以获取所有非成年作者:

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

首先,您的
年龄
字段应该是一个
整型字段

age = models.IntegerField(max_length = 3)
如果你想要最后一本,比如说,每十年作者三本书,你可以这样查询:

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

你想要最后几本书?@doru每个作者最后一本(最新的)书请不要注意模型。这只是一个例子来说明我需要什么。代码是从django的书中复制出来的,经过了一些修改。我只需要最新的书。使用[:1]获取它是否合理,或者有更快捷的方法吗?
>>十年作者=作者.对象.过滤器(年龄=10)>>>十年作者[,]
>>十年作者和他们的最后一本书=十年作者.选择相关的('book\u set')[:3]>>十年作者和他们的最后一本书回溯(最近的调用last):。。。FieldError:与选择相关的“书籍集”中提供的字段名无效。选项是:(无)`它返回了作者的查询集:
>>Author.objects.filter(age=10)。预回迁相关('book\u set')[,]