django - 排序对象 - 在逻辑上需要一些帮助

时间:2014-06-10 12:20:19

标签: python django

我有Topiccenter模型:

class TopicCenter(models.Model):
  title = models.TextField()      
  def latest_entry(self):
    latest_entries = []
    book = self.tc_books.order_by('-id')[:1]
    journal = self.tc_journals.order_by('-id')[:1]
    if book: 
        for b in book:
            if b:
                latest_entries.append(b)
    if journal: 
        for jn in journal: 
            if jn: 
                latest_entries.append(jn)
    lastone = []
    if latest_entry:            
        lastone = max(latest_entries, key = lambda x: x.added)
    return lastone
    # what to return here if lastone is empty list ?? :(

每个主题中心都可以有很多书籍和期刊。我想通过其added字段获取最新条目。

我现在正在按其最新条目的日期对主题中心进行排序。现在我面临的问题是,一些话题中心完全是空的(没有书,没有期刊),所以如果latest_entry()latest_entry,我不知道在[]方法中要返回什么,以便我可以像这样在这里使用它:

tcss = TopicCenter.objects.all().distinct('id')  
sorter = lambda x: x.latest_entry().added
tcs = sorted(tcss, key=sorter, reverse=True)

此刻我收到'list' object has no attribute 'added',因为一个Topiccenter既没有书也没有日记,因此latest_entry()正在返回[],导致出现错误消息。

有人可以帮助我如何解决这个逻辑:(

2 个答案:

答案 0 :(得分:1)

我假设你在其他地方也使用latest_entry(),所以只需创建另一个方法latest_added_time(),它返回latest_entry.added或假的时间。

class TopicCenter(models.Model):
    ...
    def latest_added_time(self):
        latest = self.latest_entry()
        if latest:
            return latest.added
        else:
            # returns a time to place it at the end of the sorted list
            return datetime(1, 1, 1) 

然后,您可以对这种新方法进行排序:

tcss = TopicCenter.objects.all().distinct('id')  
sorter = lambda x: x.latest_added_time()
tcs = sorted(tcss, key=sorter, reverse=True)

如果您没有使用latest_entry()进行其他任何操作,那么您应该将此逻辑直接放入该函数中。

答案 1 :(得分:0)

您可以尝试更改条件

if not book and not journal:
    #Action you want to perform

或者您可以看到lastone列表是否为空,您可以在其中附加任何消息,例如

if not len(lastone):
    #Your code to append a message