【问题标题】:Django Q objects vs python code better performance?Django Q 对象与 python 代码性能更好?
【发布时间】:2022-09-26 16:14:36
【问题描述】:

在 django ORM 中使用 Q 过滤条件或简单地获取未过滤的对象并在 python 中进行比较可以提供更好的性能。

employee_qs = employee.objects.filter(state=States.ACTIVE, topic_assn__topic_id=instance.ss_topic_id).select_related(\'c_data\').filter(
                Q(c_data__is_null=True) | Q(c_budget__gt=F(\'c_data__budget_spent\') + offset_amt))

V/s


employee_qs = employee.objects.filter(state=States.ACTIVE, topic_assn__topic_id=instance.ss_topic_id).select_related(\'c_data\')
for employee in employee_qs:
    if not employee.c_data or float(employee.budget)-employee.c_data.budget_spent > offset_amt:
        #do something...

这两个选择中哪一个在性能方面会更好?

    标签: python django django-models django-orm


    【解决方案1】:

    TLDR:Q 对象会更快。

    为什么?使用Q 对象完成的过滤将在 SQL 服务器(PostgreSQL、MariaDB)上完成。所以要考虑两个方面:

    • 使用Q 对象,未经过滤的数据不会从您的数据库传输到您的django 服务器(网络上的数据越少,速度越快);
    • Q 对象转换为 SQL WHERE 子句,具体取决于您的表的配置方式(例如,您正在过滤的列上是否存在索引)SQL 将使用这些索引来过滤数据,速度比在服务器端。此外,SQL 服务器是用比 Python 快得多的语言编写的。

    【讨论】:

      猜你喜欢
      • 2014-08-01
      • 2018-09-14
      • 2010-11-01
      • 2021-07-04
      • 2013-06-17
      • 2014-05-15
      • 2015-03-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多