#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