Джанго использует вычисляемое поле для ordering_fields - PullRequest
0 голосов
/ 16 октября 2019

Я использую 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()

В представлении Iхотел бы сделать что-то вроде:

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

Ответы [ 2 ]

0 голосов
/ 16 октября 2019

Взгляните на метод extra . И вы можете переопределить метод get_queryset на ModelViewSet.

class MyModelViewSet(viewsets.ModelViewSet):
    serializer_class = MyModelSerializer

    def get_queryset(self):
        queryset = super().get_queryset()
        queryset = MyModel.objects.extra(select={'due_date_diff': 'due_date - final_due_date'}).extra(order_by=['-due_date_diff'])
        return queryset
0 голосов
/ 16 октября 2019

Вы не можете сделать заказ для такого свойства, как это, но вы можете аннотировать свой 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 для этой аннотации. .

...