首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何有效地对django模型中的自定义字段进行排序?

如何有效地对django模型中的自定义字段进行排序?
EN

Stack Overflow用户
提问于 2014-05-23 13:37:09
回答 1查看 75关注 0票数 1

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

然后根据这些自定义字段对引线进行排序,并显示结果。

这种方法很慢。

如何优化和提高速度?

模型如下

铅模型

代码语言:javascript
复制
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"

邮件历史记录模型

代码语言:javascript
复制
class MailingHistory(models.Model):

  lead = models.ForeignKey(Lead)
  returned_envelope = models.BooleanField()
  mailing_date = models.DateField(blank=True, null=True)

导致列表函数

代码语言:javascript
复制
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

排序逻辑

代码语言:javascript
复制
# 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)
EN

回答 1

Stack Overflow用户

发布于 2014-05-27 22:34:40

您可以在查询中使用筛选、限制和排序。小心奎尔塞特。函数len计数列表中的对象。使用count (运行查询以计数的函数)更有效。

希望我能帮上忙。

代码语言:javascript
复制
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"
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23830742

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档