我加载所有潜在客户,迭代查询集并填充自定义字段。 自定义字段取决于其他模型。
然后我按照这些自定义字段对引线进行排序并显示结果。
这种方法非常慢。
如何优化和提高速度?
模型如下
潜在客户模式
class Lead(LeadModel):
def most_recent_mailing_date(self):
""" Return the most recent mailing date """
mailingHistories = self.mailinghistory_set.all()
if len(mailingHistories) != 0:
today = datetime.date.today()
mostRecentHistory = None
diff = -1
for mailingHistory in mailingHistories:
if mailingHistory.mailing_date < today and (diff == -1 or (today - mailingHistory.mailing_date) < diff):
mostRecentHistory = mailingHistory
diff = today - mostRecentHistory.mailing_date
if mostRecentHistory is None:
return "No Mailing History"
else:
return mostRecentHistory.mailing_date
else:
return "No Mailing History"
def next_mailing_date(self):
""" Return the next mailing date """
mailingHistories = self.mailinghistory_set.all()
if len(mailingHistories) != 0:
today = datetime.date.today()
nextHistory = None
diff = -1
for mailingHistory in mailingHistories:
if mailingHistory.mailing_date > today and (diff == -1 or (mailingHistory.mailing_date - today) < diff):
nextHistory = mailingHistory
diff = mailingHistory.mailing_date - today
if nextHistory is None:
return "No Future Mailings"
else:
return nextHistory.mailing_date
else:
return "No Future Mailings"
邮件历史记录模型
class MailingHistory(models.Model):
lead = models.ForeignKey(Lead)
returned_envelope = models.BooleanField()
mailing_date = models.DateField(blank=True, null=True)
导致列出功能
def leads_to_list(queryset):
holder = []
for item in queryset:
item_dict = item.__dict__
recent_mailing_date = item.most_recent_mailing_date()
next_mailing_date = item.next_mailing_date()
if not type(recent_mailing_date) == datetime.date:
recent_mailing_date_key = NONE_DATE
else:
recent_mailing_date_key = recent_mailing_date
if not type(next_mailing_date) == datetime.date:
next_mailing_date_key = NONE_DATE
else:
next_mailing_date_key = next_mailing_date
item_dict['recent_mailing_date'] = recent_mailing_date
item_dict['recent_mailing_date_key'] = recent_mailing_date_key
item_dict['next_mailing_date'] = next_mailing_date
item_dict['next_mailing_date_key'] = next_mailing_date_key
if '_state' in item_dict:
del item_dict['_state']
holder.append(item_dict)
return holder
排序逻辑
# Code to be optimized #
leads = Lead.objects.all()
leads = queryset_to_list(leads) # Important for serialization. json.dumps
sort_key = 'recent_mailing_date_key'
sort_reverse = True
leads = sorted(leads,key=itemgetter(sort_key),reverse = sort_reverse)
return json.dumps(leads)
答案 0 :(得分:0)
您可以在查询中使用过滤器,限制和排序。 注意查询集的len。函数len计算列表的对象。使用count(运行查询来计算的函数)更有效。
我希望我能帮到你。
class Lead(LeadModel):
def most_recent_mailing_date(self):
""" Return the most recent mailing date """
today = datetime.date.today()
mailingHistories = self.mailinghistory_set.filter(mailing_date__lt=today).order_by('-mailing_date', '-id')[:1]
if len(mailingHistories) != 0:
return mostRecentHistory[0].mailing_date
else:
return "No Mailing History"
def next_mailing_date(self):
""" Return the next mailing date """
today = datetime.date.today()
mailingHistories = self.mailinghistory_set.filter(mailing_date__gt=today).order_by('mailing_date', 'id')[:1]
if len(mailingHistories) != 0:
return mostRecentHistory[0].mailing_date
else:
return "No Future Mailings"