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。
我正在使用 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。