django访问模型需要花费很多时间

时间:2014-07-29 18:09:22

标签: python mysql django templates render

我有一个这样的模型:

class Event(models.Model):
    description = models.CharField(max_length=3072)
    severity = models.CharField(max_length=96)
    reception_timestamp = models.DateField()
    version = models.CharField(max_length=100)
    mail_archive_id = models.PositiveIntegerField()
    component_id = models.CharField(max_length=32)
    technician_at_work = models.BooleanField()
    timestamp = models.DateField(db_index=True)
    system = models.ForeignKey(System)
    event_code = models.ForeignKey(EventCode)

在我的views.py文件中,我尝试访问信息所在的MySql数据库。

我运行了一些QuerySets操作,然后我继续从模型中提取我需要的信息,将其渲染为html模板,但是提取信息需要花费太多时间:

events = Event.objects.filter(system_id=system_id).filter(timestamp__range=[from_date, now])
return [ e.timestamp, e.system.serial_number, e.version, e.event_code.code, e.description, e.severity, e.reception_timestamp for e in events ]

我尝试了一些方法,例如创建生成器并将其发送到模板,使用它来呈现HTML文档,但是访问信息的时间相同。

我该怎么办?只需要一到两分钟就可以获得270行。 我检测到查询需要几秒钟,但是访问消耗剩余时间的信息。我怎样才能提升这个?

谢谢!

1 个答案:

答案 0 :(得分:0)

两点:

1)QuerySets被懒惰地评估,因此计时它们可能有点奇怪。 “events = Event.objects ...”行是否需要几秒钟,或者您是否计时查询集 plus 获取数据?后者看起来像这样:

start = time.time()
# build lazy queryset:
events = Event.objects.filter(system_id=system_id).filter(timestamp__range=[from_date, now])
# evaluate and flatten queryset:
res = [ e.timestamp, e.system.serial_number, e.version, e.event_code.code, e.description, e.severity, e.reception_timestamp for e in events ]
logging.info('query took %s', time.time()-start)

2)您可以使用values_list()方法直接为您输出QuerySet,而不是使用单独的for循环。即:

events = Event.objects.filter(system_id=system_id).filter(timestamp__range=[from_date, now])
event_vals = events.values_list('timestamp', 'system.serial_number') # more here
return event_vals

第一行构建一个惰性QuerySet,描述您想要的数据类型。第二行要求Django只给你一个元组列表。它为您重新排序和展平数据,并且可能比将所有行显式转换为Models更快,然后使用单独的循环提取数据。