问题描述
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
,我将其与某个时间戳进行比较,并在满足某些条件的情况下放入视觉标记。
1楼
尝试:
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