我想了解如何
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的最佳实践)?可以给点建议吗?
这是另一种方法,无需重写序列化器的
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)