使用Django Rest Framework 3.6.3,我在模型中有一个选择CharField:
# models.py
class User(AbstractUser):
GENDER_CHOICES = (
('M', 'Male'),
('F', 'Female'),
)
gender = models.CharField(max_length=1, choices=GENDER_CHOICES)
# viewsets.py
class UserViewSet(viewsets.ModelViewSet):
queryset = User.objects.all()
serializer_class = UserSerializer
我发布到终端:
{ 'gender': 'M' }
当我获取端点时,我希望它显示:
{ 'gender': 'Male' }
使用以下序列化程序,它显示选择(男性)的显示值而不是值(M),但它不会保存:
# serializers.py
class UserSerializer(serializers.ModelSerializer):
# for some reason on save, gender is None??
gender = serializers.SerializerMethodField()
class Meta:
model = User
def get_gender(self, obj):
return obj.get_gender_display()
如果我添加to_internal_value
方法,那么它可以正常工作(显示性别选择显示值,还可以保存:
# serializers.py
class UserSerializer(serializers.ModelSerializer):
gender = serializers.SerializerMethodField()
class Meta:
model = User
def get_gender(self, obj):
return obj.get_gender_display()
def to_internal_value(self, data):
# if I add a to_internal_value that does nothing, it saves??
return data
为什么这样做?有没有更明显的方法我应该写这个?
答案 0 :(得分:2)
覆盖to_internal_value
有效,因为您绕过了每个字段to_internal_value
来电。
另一种解决方案是:
class UserSerializer(serializers.ModelSerializer):
gender = serializers.ChoiceField(choices=User.GENDER_CHOICES)
class Meta:
model = User