【问题标题】:Django ORM object.related.id vs object.related_id after used select_related('related')使用 select_related('related') 后的 Django ORM object.related.id vs object.related_id
【发布时间】:2021-06-28 06:57:00
【问题描述】:

假设我们有这个模型:

class Product(models.Model):
    ....
    price = models.DecimalField(max_digits=12, decimal_places=2)

class Order(models.Model):
    ....
    product= models.ForeignKey(Product)

使用 select_related 进行 Order.objects.filter(...).select_related('product') 这样的查询后,order.product.idorder.product_id 之间的性能是否有差异?

【问题讨论】:

  • 没有性能差异,因为我们使用select_related('product') 预填充了product
  • 不会有性能差异,因为如果我们.select_related('product'),Django 将加载相关的Product 对象,并将其作为属性添加到Order
  • 造型有点奇怪,因为这意味着对于一个订单,您只能订购一个(类型)Product?
  • @WillemVanOnsem 非常感谢。我写这个是为了解释我想要什么:)

标签: python django orm django-orm


【解决方案1】:

会有区别,但与数据库无关。在 Python 中访问任何对象字段总是有性能成本,因此对于指定的示例:

order.product.id

需要从 2 个不同的对象获取 2 个不同的属性,首先需要从 order 获取 product 属性,然后需要从 product 获取 id

order.product_id

只需要从 order 获取 1 个属性:product_id

这纯粹是关于从内存中获取正确的数据,这在 Python 中不是免费的,它不涉及对数据库或其他资源的任何 IO。在很多情况下,这个成本非常小,可以省略,因为在您的代码中可能会有更多类似的操作。

【讨论】:

  • 这就是我正在寻找的答案,非常感谢。
猜你喜欢
  • 2020-03-21
  • 2017-05-25
  • 1970-01-01
  • 2010-12-09
  • 2015-09-23
  • 1970-01-01
  • 1970-01-01
  • 2016-01-18
  • 1970-01-01
相关资源
最近更新 更多