我有一个模型:
class Project(models.Model):
title = models.CharField("Project title", max_length=128)
start_date = models.DateField("Project start date", blank=True, null=True)
end_date = models.DateField("Project end date", blank=True, null=True)
@property
def has_ended(self):
return self.end_date is not None and self.end_date < timezone.now().date()
我想按两个领域排序项目:start_date(desc)并显示尚未结束的项目。我知道我不能按属性排序,所以我尝试了以下解决方案:
class ProjectViewSet(viewsets.ModelViewSet):
queryset = Project.objects.all().order_by("-start_date")
queryset = sorted(queryset, key=lambda a: a.has_ended)
serializer_class = ProjectSerializer
permission_classes = [permissions.IsAuthenticated]
这是一个已经回答了其他职位与这个问题。但是,我仍然得到以下错误:AttributeError: 'list' object has no attribute 'model'
我也尝试使用Django注解,如下所示:
queryset = Project.objects.annotate(has_ended=F('start_date')-F('end_date')).order_by('has_ended', '-start_date')
但服务器返回此错误:
File "/usr/local/lib/python3.8/site-packages/django/db/models/query.py", line 78, in __iter__
django_1 | setattr(obj, attr_name, row[col_pos])
django_1 | AttributeError: can't set attribute
我对如何实现我想要的行为已经没有什么想法了。有人能帮我一把吗?
2条答案
按热度按时间cpjpxq1n1#
在这里,您将
queryset
属性更改为list
示例:您不能这样做,因为视图需要正确的
QuerySet
对象。你可以使用简单的filter来清理Django
QuerySet
:表达式
lt
的意思是less than
。双下划线用于分隔您过滤所依据的逻辑链的各个部分。luaexgnf2#
正如@NixonSparrow所说,这种行为可以通过按结束日期描述排序来实现