django - 按对象的 date_created 属性对来自不同模型的查询集对象列表进行排序

标签 django sorting django-queryset

我有不同的模型,所有模型都有一个名为“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()

View .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”。

这些模型还有与此问题无关的其他字段。我可以使用一个公共(public)基类将所有对象组合在一起(我想),但由于某种原因我使用了一个抽象基类。我怀疑可以使用“连接”,但我不知道该怎么做。

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

最佳答案

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

问题出在这一行:

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

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

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

休息一切都很好。另外,正如有问题所指出的,multi table inheritence可以使用 order_by

在单个查询中排序所有结果

关于django - 按对象的 date_created 属性对来自不同模型的查询集对象列表进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17807243/

相关文章:

python - 无法使用 Django 和 Python 在 URL 查询字符串中传递值

Django 自动完成自动完成未注册错误

python - 您如何在开发环境中配置 Sentry raven 客户端以不发送异常并且仍然​​可以工作?

java - 类不会计算它应该计算的内容,也是 : sorting arrays of objects?

python - 使用 Django : How to serve a file for download?

python - 使用 python 2 根据自定义行顺序对 2D 锯齿状列表进行排序

c - 将来自多个函数的数据存储在数组中

django - 关系 (x > 1)-对多

python - Django 组合可变数量的查询集

python - 多对多关系中的复杂 Django 查询