我正在使用Django和Django Rest Framework以及PostgreSQL。我需要在模型上创建一个计算字段,并且还需要按字段排序。 我想@property
装饰器用于计算字段,但据我所知,我无法将此"字段"添加到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)
您不能对这样的属性进行排序,但可以像这样批注 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 进行排序。