在django模型中对自定义字段进行排序的有效方法是什么?

时间:2014-05-23 13:37:09

标签: django django-models orm

我加载所有潜在客户,迭代查询集并填充自定义字段。 自定义字段取决于其他模型。

然后我按照这些自定义字段对引线进行排序并显示结果。

这种方法非常慢。

如何优化和提高速度?

模型如下

潜在客户模式

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)

1 个答案:

答案 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"