检测Django相关对象是否已通过select_lated预取

问题描述 投票:0回答:1

假设我有以下型号:

class Product:
    name = models.CharField(max_length=128)

class ProductVersion:
    name = models.CharField(max_length=128)
    product = models.ForeignKey(Product, on_delete=models.CASCADE)

对于给定的

ProductVersion
对象,是否有办法检测
Product
对象是否通过
select_related
预取?例如:

# Yes, "product" was prefetched
ProductVersion.objects.select_related("product").first()

# No, "product" was NOT prefetched
ProductVersion.objects.first()

看起来有一种方法可以做到这一点是

prefetch_related
(请参阅此处),但我需要它
selected_related

django django-orm
1个回答
0
投票

您可以使用查询中的

JOIN
单词检查来做到这一点

queryset = ProductVersion.objects.select_related("product")
sql_query = str(queryset.query) # convert ORM query to SQL query
if 'JOIN' in sql_query:
    print("Product object was prefetched via select_related")
else:
    print("Product object was NOT prefetched via select_related")
© www.soinside.com 2019 - 2024. All rights reserved.