我加载所有引线,迭代查询集并填充自定义字段。自定义字段依赖于其他模型。
然后根据这些自定义字段对引线进行排序,并显示结果。
这种方法很慢。
如何优化和提高速度?
模型如下
铅模型
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)发布于 2014-05-27 22:34:40
您可以在查询中使用筛选、限制和排序。小心奎尔塞特。函数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"https://stackoverflow.com/questions/23830742
复制相似问题