访问反向关系的prefetch_related字段

bal*_*oth 3 django orm django-models

我有这个型号

class Animal(models.model):
    name = models.CharField()

class Dog(Animal):
    field = models.IntegerField()

class Owner(models.model):
    animal = models.ForeignKey(Animal)
    name = models.CharField()
Run Code Online (Sandbox Code Playgroud)

现在假设我想要所有狗和它们的主人的名字.

dogs = Dog.objects.all().prefetch_related('owner_set')
Run Code Online (Sandbox Code Playgroud)

如何访问owner.namedogs

ale*_*cxe 5

你可以从owner_set:

[owner.name for dog in dogs for owner in dog.owner_set.all()]
Run Code Online (Sandbox Code Playgroud)

与来自相关对象的预先缓存数据不同select_related(),prefetch_related()因此每次我们需要每只狗拥有一个owner_set时,这不会打到数据库 - 请参阅docs.