在第一个示例中,如果关系设置为:
from django.db import models
class Author(models.Model):
name = models.CharField(max_length=100)
books = models.ManyToMany(Book)
def latest_book(self):
"""
This is only efficient / accurate if you've prefetched books
in the right order!
"""
if self.books.exists():
return self.books.all()[0]
return None
class Book(models.Model):
name = models.CharField(max_length=300)
pubdate = models.DateField()
然后用
Prefetch
1.7中引入的对象:
from django.db.models import Prefetch
authors = Author.objects.all().prefetch_related(
Prefetch('books', queryset=Books.objects.order_by('-pubdate')
for author in authors:
print author.latest_book()
2个数据库查询,但当然要注意,您正在将每个作者的每本书加载到内存中。也就是说,使用Prefetch对象的queryset arg,您可能会提高效率。
我做的
latest_book
Author的成员,以保持示例代码的简洁,但实际上,您可能希望这超出Author模型的定义,因为它在调用适当预取的特定实现之外没有用处。
我不熟悉django多态包,但我打赌您可以使用这种方法来获得优势,因为预取也支持通用关系。