【问题标题】:What is the efficient way to sort custom fields in django models?在 django 模型中对自定义字段进行排序的有效方法是什么?
【发布时间】:2014-07-12 21:39:52
【问题描述】:

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

然后我按这些自定义字段对潜在客户进行排序并显示结果。

这个方法很慢。

如何优化和提高速度?

型号如下

首席模特

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)

【问题讨论】:

  • 那么您需要分析的功能是什么?或者哪个代码看起来很慢?
  • 只需要lead_object.mailinghistory_set.order_by('-mailing_date')吗?如果不是,请添加有关您想要做什么的更多详细信息。
  • 我添加了更多细节。

标签: django django-models orm


【解决方案1】:

您可以在查询中使用过滤器、限制和排序依据。 小心查询集的 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"

【讨论】:

    猜你喜欢
    • 2014-06-10
    • 1970-01-01
    • 1970-01-01
    • 2021-12-14
    • 1970-01-01
    • 1970-01-01
    • 2010-11-07
    • 2021-06-09
    • 2011-06-20
    相关资源
    最近更新 更多