优化Django中的计数查询

时间:2018-01-09 20:19:52

标签: python django django-orm

我有以下疑问:

files = DataAvailability.objects.all()
type1 = files.filter(type1=True)
type2 = files.filter(type2=True)

# People information
people = Person.objects.all()
users = people.filter(is_subject=True)

# count information (this is taking a long time to query them all)
type1_users = type1.filter(person__in=users).count()
type2_users = type2.filter(person__in=users).count()
total_users = files.filter(person__in=users).count()
# another way
total_users2 = files.filter(person__in=users)
type1_users2 = total_users.filter(type1=True).count()
type2_users2 = total_users.filter(type2=True).count()
total_count = total_users2.count()

我考虑使用.values()创建一个查询并放入set()。 完成后,执行集合中的一些函数(如diff)。

这是改善查询时间的唯一方法吗?

2 个答案:

答案 0 :(得分:1)

您始终可以执行原始SQL https://docs.djangoproject.com/en/2.0/topics/db/sql/#performing-raw-queries

示例:

# Dont do this its insecure
YourModel.objects.raw(f"select id from {YourModel._meta.db_table}") 

# Do like this to avoid SQL injection issues.
YourModel.objects.raw("select id from app_model_name") 

表的名称可以获取为:YourModel._meta.db_table,你也可以获得这样的查询集的sql:

type1_users = type1.filter(person__in=users)
type1_users.query.__str__()

因此,您可以将此查询加入另一个查询。

答案 1 :(得分:0)

我不必经常提出这些问题(最多一次一次)。所以我正在运行一个将数据导出到文件的cron作业(你可以在数据库中创建一个表用于审计目的,例如)。然后我读取文件并使用那里的数据。它运作良好/快速。