我有两种模式:
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和数据库来做到这一点?
答案 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]