我正在尝试使用带有 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
。
答案 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
对象。