6

假设我有一个包含电影、书籍和软件的数据库,它们都继承了一个 Item 模型。

class Item(models.Model):
    ...

class Movie(models.Model):
    item = models.OneToOneField(Item)
    ...

class Book(models.Model):
    item = models.OneToOneField(Item)
    ...

class Software(models.Model):
    item = models.OneToOneField(Item)
    ...

现在我想对项目进行数据库查询,但我想获取与该项目相关的对象,无论是电影、书籍还是软件。如果所有项目都是一种类型,例如电影,那么我可以执行以下操作:

Item.objects.prefetch_related('movie')

但是,无论它是什么类型,我都需要能够获取相关对象。我可以运行:

Item.objects.prefetch_related('movie', 'book', 'software')

无论它是什么类型,这都会找到相关的对象,这是否有效?有没有更好的方法来做到这一点?

4

1 回答 1

6

我假设OneToOneFields 已related_name设置为您的 QuerySet 示例所指示的,即'movie','book''software'

要向后遍历您不需要的一对一关系prefetch_related,这很容易通过LEFT OUTER JOIN自动生成的select_related. 这意味着,你应该能够做到

Item.objects.select_related('movie', 'book', 'software')

并且每个返回的 Item 实例将自动包含相应的缓存实例MovieBook并且Software(当然,如果有的话)。

prefetch_related仅当您想要避免具有多对多或多对一关系的 O(N) 查询问题时才需要,即ManyToManyField使用ForeignKey.

于 2012-04-21T00:30:50.197 回答