2013-07-23 41 views
1

我有不同的模型,所有模型都有一个名为'date_created'的'DateTimeField'。我需要从所有模型中选择所有对象,按照'date_created'这个字段对它们进行排序并作为列表返回。通过对象的date_created属性对不同模型的查询集对象列表进行排序

我曾尝试以下:

models.py

class FirstModel(models.Model): 
    title = models.CharField(max_length=100) 
    date_created = models.DateTimeField() 


class SecondModel(models.Model): 
    title = models.CharField(max_length=100) 
    date_created = models.DateTimeField() 

views.py

def browse(request): 
    object_list = [] 
    for model in get_models(get_app('myapp')): 
     object_list.append(model.objects.order_by('-date_created').all()) 
    object_list = sorted(object_list, key=attrgetter('date_created')) 
    context = {'data': object_list} 
    return render(request, 'myapp/browse.html', context) 

我得到的错误 '查询集' 对象有没有属性 'DATE_CREATED'。

这些模型有其他领域与此问题无关。我可以使用一个通用的基类来获取所有对象(我想),但由于某种原因我使用了抽象基类。我怀疑'连接'可以使用,但我不知道如何做到这一点。

那么,如何通过date_created属性来对这个object_list(这是来自不同模型的对象列表)进行排序呢?

回答

3

我找到了一些更多研究的答案。

的问题是在这条线:

object_list.append(model.objects.order_by('-date_created').all()) 

虽然我使用“追加”,它是作为一个正常的列表,而不是查询集对象的列表{我有点不确定这个处理,基本上这一行给了我一个列表,我只需要列出所有queryset对象。 }更正此chain()从itertools可以通过导入链和替换上面的行一起使用,如下所示:

from itertools import chain 
... 
... 
object_list = chain(object_list, (model.objects.order_by('-date_created').all())) 
... 

休息一切都很好。另外,正如其指出的那样,可以使用multi table inheritence,它可以通过使用order_by

1

我想你应该与此代码替换此代码

object_list.append(model.objects.order_by('-date_created').all()) 

object_list.append(model.objects.all().order_by('-date_created')) 

而且我觉得你不需要使用此代码

object_list = sorted(object_list, key=attrgetter('date_created')) 

因为你已排序已使用“order by”

+0

得到所有结果在一个查询中排序。其实,你所讲的会让我从不同的模型中排序列表,但我需要排序最终列表即所有单独排序的模型对象列表的组合。 –

相关问题