一次获取相关和反向相关的对象 - Django

时间:2021-07-23 19:17:34

标签: python django

我正在尝试使用带有 select_related() 的一行来获取我的数据库中的对象。

这是我的模型:

class Asset(models.Model):
     """Store information about an asset."""
    is_active = models.BooleanField(default=True)
    rank = models.PositiveIntegerField()


class AssetMarketData(models.Model):
    """Store market data of an asset."""
    asset = models.OneToOneField(Asset, related_name="market_data", on_delete=models.CASCADE)


class AssetQuote(models.Model):
    """Store quotes of an asset."""
    asset = models.ForeignKey(Asset, related_name="quote", on_delete=models.CASCADE)

我想像这样使用 Asset 检索所有 select_related() 对象:

assets = Asset.objects.order_by('rank').select_related('market_data', 'quote')

然而,这是不可能的,因为引用是反向关系。

我可以使用以下方式访问引号:

assets[0].quote.all()

但我一次只能做一个Asset,我想避免这样做。

prefetch_related() 只能检索反向相关的对象,因此它没有帮助。

所以我想知道当我选择所有 AssetQuote 对象时如何检索所有相关的 Asset

1 个答案:

答案 0 :(得分:1)

<块引用>

我可以使用以下方式访问引号:

assets[0].quote.all()

这部分是有问题的部分。 QuerySet 是惰性的,因此这意味着 assets[0] 将执行一个查询来获取相关的 Asset 对象,以及另一个(由于 .prefetch_related(…))相关的 AssetQuote 对象。

您可以通过遍历整个 QuerySet(例如使用 for 循环)或将其具体化为列表来实现加速,例如:

assets = Asset.objects.order_by('rank').select_related(
    'market_data'
).prefetch_related('quote')

for asset in assets:
    # ... do something
    pass

这将进行两个查询以获取 Asset 以及相关的 rank 和相关的 AssetQuote 对象。