【发布时间】:2015-12-16 16:48:03
【问题描述】:
我的页面加载速度太慢。不知何故,我需要改进查询数据的方式(缓存?部分加载/页面?等)
请注意,我是 django 菜鸟,并没有完全理解 model.Manager 和 models.query.QuerySet,所以如果这个设置看起来很尴尬......
目前,页面加载查询集大约需要 18 秒,并且目前只有大约 500 条记录。平均每天会有大约 100 条新记录。
数据库是Postgresql
缓慢的视图:
def approvals(request):
...
approved_submissions = QuestSubmission.objects.all_approved()
...
缓慢的查询集:
class QuestSubmissionQuerySet(models.query.QuerySet):
...
def approved(self):
return self.filter(is_approved=True)
def completed(self):
return self.filter(is_completed=True).order_by('-time_completed')
...
class QuestSubmissionManager(models.Manager):
def get_queryset(self):
return QuestSubmissionQuerySet(self.model, using=self._db)
def all_approved(self, user=None):
return self.get_queryset().approved().completed()
...
QuestSubmission.objects.all_approved() 产生的 SQL:
'SELECT "quest_manager_questsubmission"."id", "quest_manager_questsubmission"."quest_id", "quest_manager_questsubmission"."user_id", "quest_manager_questsubmission"."ordinal", "quest_manager_questsubmission"."is_completed", "quest_manager_questsubmission"."time_completed", "quest_manager_questsubmission"."is_approved", "quest_manager_questsubmission"."time_approved", "quest_manager_questsubmission"."timestamp", "quest_manager_questsubmission"."updated", "quest_manager_questsubmission"."game_lab_transfer" FROM "quest_manager_questsubmission" WHERE ("quest_manager_questsubmission"."is_approved" = True AND "quest_manager_questsubmission"."is_completed" = True) ORDER BY "quest_manager_questsubmission"."time_completed" DESC'
慢模型:
class QuestSubmission(models.Model):
quest = models.ForeignKey(Quest)
user = models.ForeignKey(settings.AUTH_USER_MODEL, related_name="quest_submission_user")
ordinal = models.PositiveIntegerField(default = 1, help_text = 'indicating submissions beyond the first for repeatable quests')
is_completed = models.BooleanField(default=False)
time_completed = models.DateTimeField(null=True, blank=True)
is_approved = models.BooleanField(default=False)
time_approved = models.DateTimeField(null=True, blank=True)
timestamp = models.DateTimeField(auto_now=True, auto_now_add=False)
updated = models.DateTimeField(auto_now=False, auto_now_add=True)
game_lab_transfer = models.BooleanField(default = False, help_text = 'XP not counted')
class Meta:
ordering = ["time_approved", "time_completed"]
objects = QuestSubmissionManager()
#other methods
....
有什么策略可以解决这个问题?我尝试使用 django 的 Paginator,但它似乎只显示在页面中,但它仍然加载整个查询集。
【问题讨论】:
-
您是否尝试过使用
manage.py shell和str(QuestSubmission.objects.all_approved().query())来查看它实际生成的SQL?否则代码看起来很正常,问题可能出在其他地方。 -
我得到:
TypeError: 'Query' object is not callable -
哦,对不起,应该只是
str(QuestSubmission.objects.all_approved().query) -
您的浏览器计时并不能真正告诉您服务器的瓶颈在哪里。您可以尝试添加django-debug-toolbar,这将分解服务器端的执行时间并显示哪些查询正在访问数据库。
标签: python django performance postgresql django-queryset