序列化器_字段_映射DRF

问题描述 投票:0回答:1

我想了解如何

serializer_field_mapping

在 Django Rest Framework 中工作以及如何正确使用它(在以下代码的上下文中)。

我有这个代码:
# 模型.py

class TestModel(models.Model):
    name = models.CharField()
    number = models.IntegerField()

# 序列化器.py

class CustomCharField(serializers.CharField):
    def to_representation(self, value):
        return f"!!!{str(value)}!!!"
class TestModelSerializerTwo(serializers.ModelSerializer):

    class Meta:
        model = TestModel
        fields = ["id", "name", "number"]
        serializer_field_mapping = {
            models.CharField: CustomCharField,
        }

调用serializer.data时的期望的输出将添加“!!!” CharField 值之前和之后(它不适用于我之前的代码)

    {
        "id": 4,
        "name": "!!!name1!!!",
        "number": 2
    }

但我现在真的知道如何正确使用它了。

我试过这个:

class TestModelSerializerTwo(serializers.ModelSerializer):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        field_mapping = serializers.ModelSerializer.serializer_field_mapping
        field_mapping[models.CharField] = CustomCharField

        setattr(self.Meta, 'serializer_field_mapping', field_mapping)

    class Meta:
        model = TestModel
        fields = ["id", "name", "number", "edited_name"]

它给了我这个:

    {
        "id": 4,
        "name": "!!!name1!!!",
        "number": 2
    }

但是这是使用serializer_field_mapping的正确方法吗(因为它似乎没有遵循我的案例中覆盖init的最佳实践)?可以给点建议吗?

serialization django-rest-framework
1个回答
0
投票

这是另一种方法,无需重写序列化器的

init()
方法即可实现此目的。请注意,我们可以复制
serializer_field_mapping
(这是一本字典),然后将
charField
分配给
CustomCharField
。这是实现此目的的完整代码:

#serializers.py

from django.db import models
from rest_framework import serializers

from djangoProject.models import TestModel


class CustomCharField(serializers.CharField):
    def to_representation(self, value):
        return f"!!!{str(value)}!!!"

class TestModelSerializerTwo(serializers.ModelSerializer):
    serializer_field_mapping = (
        serializers.ModelSerializer.serializer_field_mapping.copy()
    )
    serializer_field_mapping[models.CharField] = CustomCharField

    class Meta:
        model = TestModel
        fields = ["id", "name", "number"]

#views.py

from rest_framework import generics, status
from rest_framework.response import Response

from djangoProject.serializers import TestModelSerializerTwo


class TestView(generics.CreateAPIView):
    serializer_class = TestModelSerializerTwo

    def create(self, request, *args, **kwargs):
        serializer = self.serializer_class(data=request.data)
        serializer.is_valid(raise_exception=True)
        return Response(status=status.HTTP_201_CREATED, data=serializer.data)
© www.soinside.com 2019 - 2024. All rights reserved.