在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/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...

在性能方面,这两个 Select 中哪一个会更好?

推荐答案

TLDR:Q个对象会更快.

为什么?对Q个对象进行良好的过滤将在SQL服务器(PostgreSQL或MariaDB)上完成.因此,应该考虑两个方面:

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

Python相关问答推荐

有没有方法可以关闭Python多处理资源跟踪器进程?

是否有使用纯霍夫曼编码的现代图像格式?

Python 枕头上的图像背景变黑

Python(Polars):使用之前的变量确定当前解决方案的Vector化操作

解析讨论论坛只给我第一个用户 comments ,但没有给我其他用户回复

如何从格式为note:{neighbor:weight}的字典中构建networkx图?

在两极中实施频率编码

如何知道标志是否由用户传递或具有默认值?

如何计算列表列行之间的公共元素

如何调整spaCy token 化器,以便在德国模型中将数字拆分为行末端的点

SQLGory-file包FilField不允许提供自定义文件名,自动将文件保存为未命名

当使用keras.utils.Image_dataset_from_directory仅加载测试数据集时,结果不同

沿着数组中的轴计算真实条目

PMMLPipeline._ fit()需要2到3个位置参数,但给出了4个位置参数

DataFrames与NaN的条件乘法

在pandas中使用group_by,但有条件

pandas在第1列的id,第2列的标题,第3列的值,第3列的值?

Flask Jinja2如果语句总是计算为false&

如何在两列上groupBy,并使用pyspark计算每个分组列的平均总价值

(Python/Pandas)基于列中非缺失值的子集DataFrame