Django Q对象与python代码相比性能更好



使用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...

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

TLDR:Q对象将更快。

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

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

最新更新