Django 使用 ordering_fields 的计算字段

Django use calculated field for ordering_fields

我正在使用 Django 和 Django Rest Framework,以及 PostgreSQL。我需要在模型上创建一个计算字段,我还需要按字段排序。 我想到了对计算字段使用 @property 装饰器,但据我所知,我无法将此 'field' 添加到 ordering_fields 数组中。我的问题是 - 正确的方法是什么?

应该是这样的(部分):

模特-

class MyModelViewSet(models.Model):
    due_date = models.DateField(null=True, blank=True)
    final_due_date = models.DateField(null=True, blank=True)

    @property
    def due_date_diff(self):
        if self.final_due_date:
            return self.final_due_date - due_date
        else:
            return due_date - date.today()

在视图中我想做类似的事情:

class MyModelViewSet(viewsets.ModelViewSet):
    serializer_class = MyModelSerializer
    ordering_fields = tuple(serializer_class.Meta.fields + due_date_diff)

你不能像这样对 属性 进行排序,但你可以 annotate 你的 QuerySet,像这样:

def get_queryset(self):
    date_diff = ExpressionWrapper(F('final_due_date') - F('due_date'), 
                    output_field=fields.DurationField())

    return super(MyModelViewSet, self).get_queryset().annotate(due_date_diff = date_diff)

然后您可以在该注释上订购您的 QuerySet。