在Django中,使用related_name进行查询是否性能更高?

时间:2019-06-22 14:20:07

标签: django django-orm

可以说我设置了以下模型:

class Shop(models.Model):
    ...

class Product(models.Model):
    shop = models.ForeignKey(Shop, related_name='products')

现在,假设我们要查询商店中所有价格为$ 100以下的label'demo'产品。有两种方法可以做到这一点:

shop = Shop.objects.get(label='demo')
products = shop.products.filter(price__lte=100)

shop = Shop.objects.get(label='demo')
products = Products.objects.filter(shop=shop, price__lte=100)

这两个查询之间有区别吗?第一个是使用related_name属性。我知道外键已建立索引,因此使用它们进行搜索应该更快,但这是否适用于我们的第一种情况?

1 个答案:

答案 0 :(得分:2)

简短答案:这将导致等效查询。

我们可以通过打印查询来进行测试:

>>> print(shop.products.filter(price__lte=100).query)
SELECT "app_product"."id", "app_product"."shop_id", "app_product"."price" FROM "app_product" WHERE ("app_product"."shop_id" = 1 AND "app_product"."price" <= 100)
>>> print(Product.objects.filter(shop=shop, price__lte=100).query)
SELECT "app_product"."id", "app_product"."shop_id", "app_product"."price" FROM "app_product" WHERE ("app_product"."price" <= 100 AND "app_product"."shop_id" = 1)

除了交换WHERE中的条件外,两者相等。但这通常在数据库方面没有任何区别。

如果您对Shop对象本身不感兴趣,可以使用以下方法进行过滤:

products = Product.objects.filter(shop__label='demo', price__lte=100)

这将在数据库级别进行JOIN,因此将通过一次传递来检索数据:

SELECT "app_product"."id", "app_product"."shop_id", "app_product"."price"
FROM "app_product"
INNER JOIN "app_shop" ON "app_product"."shop_id" = "app_shop"."id"
WHERE "app_product"."price" <= 100 AND "app_shop"."label" = demo