我有不同的模型,所有模型都有一个名为'date_created'的'DateTimeField'。我需要从所有模型中选择所有对象,按此字段'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)
我收到错误'QuerySet'对象没有属性'date_created'。
这些模型的其他字段与此问题无关。我可以使用一个公共基类来将所有对象放在一起(我想)但是由于某种原因我正在使用抽象基类。我怀疑'加入'可以使用,但我不知道该怎么做。
那么,如何通过date_created属性对此object_list(来自不同模型的对象列表)进行排序?
答案 0 :(得分:3)
我通过更多的研究找到了答案。
问题出在这一行:
object_list.append(model.objects.order_by('-date_created').all())
当我使用“append”时,它被视为普通列表而不是查询集对象列表{我对此有点不确定,基本上这行给了我列表,我只需要一个列表所有queryset对象。要从itertools中更正此chain(),可以通过导入链并替换上面的行来使用,如下所示:
from itertools import chain
...
...
object_list = chain(object_list, (model.objects.order_by('-date_created').all()))
...
休息一切都很好。此外,正如其中指出的那样,可以使用multi table inheritence,它可以使用order_by
答案 1 :(得分: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”
进行了排序