Отображение данных, для которых не существует модели в сериализаторе — Python — Django — Фреймворк Django Rest

#python #django #django-rest-framework #django-serializer #django-rest-viewsets

Вопрос:

У меня есть «Сериализатор набора представлений модели», и мне нужен сериализатор для отображения дополнительных полей, которых нет в модели.

Модель:

 class MyModel(models.Model):
    id = models.UUIDField(primary_key=True, unique=True, default=uuid.uuid4, editable=False, null=False)
    type = models.CharField(max_length=100, null=False, blank=False)
    name = models.CharField(max_length=100, null=False, blank=False)
 

Набор представлений:

 class MyViewSet(
    mixins.ListModelMixin,
    mixins.CreateModelMixin,
    mixins.UpdateModelMixin,
    mixins.DestroyModelMixin,
    mixins.RetrieveModelMixin,
    viewsets.GenericViewSet
):
    permission_classes = [permissions.AllowAny]
    queryset = MyModel.objects.all()
    serializer_class = MySerializer

    def list(self, request, *args, **kwargs):
        queryset = MyModel.objects.filter(organization_id=request.user.my_connection_id)
        page = self.paginate_queryset(queryset)
        serializer = MySerializer(page, many=True)
        return self.get_paginated_response(serializer.data)
 

Сериализатор:

 class MySerializer(ModelSerializer):
    class Meta:
        model = MyModel
        fields = ('id', 'type', 'name', 'description', 'array')
 

Мне нужно добавить следующий объект в предварительный просмотр

массив:

 [
    {'status': 'ok', 'value': '1'},
    {'status': 'pending', 'value': '5'},
    {'status': 'approval', 'value': '3'},
    {'status': 'rejected', 'value': '4'}
]
 

описание: «текстовое описание»

Комментарии:

1. На какой конечной точке вам нужны эти дополнительные поля и как вы их создаете?

Ответ №1:

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

 data = [
    {'status': 'ok', 'value': '1'},
    {'status': 'pending', 'value': '5'},
    {'status': 'approval', 'value': '3'},
    {'status': 'rejected', 'value': '4'}
]

 

Затем вы можете добавить следующее свойство в свой сериализатор MySerializer , и оно будет выглядеть следующим образом:

 class MySerializer(ModelSerializer):
    array = serializers.ReadOnlyField(default=data)
    class Meta:
        model = MyModel
        fields = ('id', 'type', 'name', 'description', 'array')
 

Где массив является пользовательским свойством вашего сериализатора, ReadOnlyField используется по-разному, например, для отображения связанной информации вместо pk в отношениях.

Ответ №2:

Вы можете создать дополнительные поля в своем сериализаторе с помощью SerializerMethodField .

https://www.django-rest-framework.org/api-guide/fields/#serializermethodfield