当前位置: 代码迷 >> python >> Python / Django Web应用程序中数据库访问查询的性能优化
  详细解决方案

Python / Django Web应用程序中数据库访问查询的性能优化

热度:70   发布时间:2023-06-14 08:45:30.0

TL; DR

在我维护的Django应用中,我正在从FOR循环中进行数据库调用。 馊主意; 我想把这个放在循环之外。 这是代码:

for link in context["object_list"]:
        try:
            latest_reply = link.publicreply_set.latest('submitted_on')
            #if latest_reply is something:
               #do something
        except:
            pass

FOR循环外的DB调用将是什么? 如您所见,我正在尝试获取每个link对象(外键关系)的最新 publicreply 请注意,可能不是每个link对象都存在publicreply 我似乎无法全神贯注于如何在循环之外进行此操作。 分析告诉我这个重复的调用会增加大量开销。


更多细节:

型号有:

class Link(models.Model):
    description = models.TextField(validators=[MaxLengthValidator(500)])
    submitter = models.ForeignKey(User)
    submitted_on = models.DateTimeField(auto_now_add=True)

class Publicreply(models.Model):
    submitted_by = models.ForeignKey(User)
    answer_to = models.ForeignKey(Link)
    submitted_on = models.DateTimeField(auto_now_add=True)
    description = models.TextField(validators=[MaxLengthValidator(250)])

class Seen(models.Model):
    seen_status = models.BooleanField(default=False)
    seen_user = models.ForeignKey(User)
    seen_at = models.DateTimeField(auto_now_add=True)
    which_reply = models.ForeignKey(Publicreply, related_name="publicreply_seen_related")

并在顶部的代码段中添加更多附带的代码:

link_ids = [link.id for link in context["object_list"]]
seen_replies = Publicreply.objects.filter(answer_to_id__in=link_ids,publicreply_seen_related__seen_user = user)
for link in context["object_list"]:
        try:
            latest_reply = link.publicreply_set.latest('submitted_on')
            if latest_reply in seen_replies:
               #do something
        except:
            pass

最后, context["object_list"]link对象的列表。 对于Django模板中显示的每个link对象,如果它有一个latest_reply ,我将其与某个时间戳进行比较,并在满足某些条件的情况下放入视觉标记。

尝试:

latest_replys = Publicreply.objects.all().order_by('answer_to','-submitted_on').distinct('answer_to')

for reply in latest_replys:
    if reply in in seen_replies:
        #do something
  相关解决方案