Динамически добавлять поле в сериализатор drf - PullRequest
0 голосов
/ 17 октября 2018

У меня есть конечная точка API, которая возвращает список объектов одной из моих моделей.У меня есть очень тривиальный сериализатор, который в настоящее время возвращает все поля модели.

Теперь мне нужно добавить к этому сериализатору другое поле, которое вычисляется путем применения логики к одному из полей модели и другой структуре данных, котораятакже вычисляется динамически - но должен рассчитываться только один раз для каждого вызова API.

Как обеспечить эту структуру для сериализатора для каждого вызова API, но не для каждого объекта, возвращаемого сериализатором?

Мой ModelViewSet (без дополнительного поля) довольно тривиален:

class MyModelViewset(ModelViewSet):
    queryset = SomeModel.objects.all()
    serializer_class = SomeModelSerializer

1 Ответ

0 голосов
/ 17 октября 2018

Некоторые предложения о том, как этого добиться:

  • Чтобы вычислить что-то только один раз и использовать его в сериализаторе, вы должны добавить его в сериализатор context .
  • Вы можете создать @ property в своем классе SomeModel, и его можно открыть через поля сериализатора только для чтения.Django также имеет @ cached_property , так что значение рассчитывается только один раз и сохраняется до тех пор, пока экземпляр делает
  • . Вы можете использовать поле SerializerMethodField , если хотите что-то вычислить (там у вас есть доступ к контексту сериализатора).

Просто краткий пример того, как это использовать.

class MyModelViewset(ModelViewSet):
    queryset = SomeModel.objects.all()
    serializer_class = SomeModelSerializer

    def get_serializer_context(self):
        context = super().get_serializer_context()
        context['my_value'] =  [] # calculate something here, you have access to self.request
        return context

class SomeModelSerializer(serializers.ModelSerializer):
    my_data = serializers.SerializerMethodField()

    class Meta:
        model = SomeModel

    def get_my_data(self, obj):
        # you have access to self.context['my_value']
        # you have access to obj.some_property
        return my_data
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...