【问题标题】:Django Rest Framework Choices Field SerializerDjango Rest 框架选择字段序列化器
【发布时间】:2018-01-04 01:17:02
【问题描述】:

使用 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

为什么会这样?有没有更明显的方法我应该写这个?

【问题讨论】:

    标签: python django-rest-framework


    【解决方案1】:

    覆盖 to_internal_value 有效,因为您绕过了每个字段 to_internal_value 调用。

    另一种解决方案是:

    class UserSerializer(serializers.ModelSerializer):
        gender = serializers.ChoiceField(choices=User.GENDER_CHOICES)
    
        class Meta:
            model = User
    

    【讨论】:

      【解决方案2】:

      你为什么不把get_gender_display 放在fields 里面?像这样:

      # serializers.py 
      class UserSerializer(serializers.ModelSerializer):
          class Meta:
              model = User
              fields = 'foo...', 'get_gender_display'
      

      【讨论】:

        猜你喜欢
        • 2015-04-03
        • 1970-01-01
        • 1970-01-01
        • 2017-03-04
        • 2014-07-30
        • 1970-01-01
        • 2015-06-29
        • 2018-10-14
        • 1970-01-01
        相关资源
        最近更新 更多