我有一个这样的模型:
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行。 我检测到查询需要几秒钟,但是访问消耗剩余时间的信息。我怎样才能提升这个?
谢谢!
答案 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更快,然后使用单独的循环提取数据。