初学者Django:如何按属性对查询集进行排序

hgc7kmma  于 2023-02-10  发布在  Go
关注(0)|答案(2)|浏览(108)

我有一个模型:

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

我对如何实现我想要的行为已经没有什么想法了。有人能帮我一把吗?

cpjpxq1n

cpjpxq1n1#

在这里,您将queryset属性更改为list示例:

queryset = sorted(queryset, key=lambda a: a.has_ended)

您不能这样做,因为视图需要正确的QuerySet对象。
你可以使用简单的filter来清理Django QuerySet

queryset = Project.objects.filter(end_date__lt=timezone.now().date()).order_by("-start_date")

表达式lt的意思是less than。双下划线用于分隔您过滤所依据的逻辑链的各个部分。

luaexgnf

luaexgnf2#

正如@NixonSparrow所说,这种行为可以通过按结束日期描述排序来实现

相关问题