2

我有不同的模型,它们都有一个名为“date_created”的“DateTimeField”。我需要从所有模型中选择所有对象,按此字段“date_created”对它们进行排序并作为列表返回。

我尝试了以下方法:

模型.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()

视图.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)

我收到错误“QuerySet”对象没有属性“date_created”。

这些模型具有与此问题无关的其他字段。我可以使用通用基类将所有对象放在一起(我想),但出于某种原因我使用了抽象基类。我怀疑可以使用“加入”,但我不知道该怎么做。

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

4

2 回答 2

4

我通过更多研究找到了答案。

问题出在这一行:

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

当我使用“追加”时,它被视为普通列表而不是查询集对象列表{我对此有点不确定,基本上这一行给了我一个列表列表,我只需要一个列表查询集对象。要从 itertools更正这个chain()可以通过导入链并替换上面的行来使用,如下所示:

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

休息一切都很好。此外,正如它所指出的那样,可以使用多表继承,它可以通过使用在单个查询中排序所有结果order_by

于 2013-07-24T12:14:02.723 回答
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”进行了排序

于 2013-07-23T10:36:11.813 回答