【问题标题】:Non-model field from data in Serializer DRF序列化器 DRF 中数据的非模型字段
【发布时间】:2019-03-22 08:39:08
【问题描述】:

我正在尝试序列化一个对象,我会将非模型字段的数据传递到序列化程序中

    data = {
        'field1': 'abc',
        'field2': 123,
    }

    serializer = UserSerializer(
        user,
        context={"request": request},
        data=request.data,
        partial=True,
    )
    serializer.is_valid(raise_exception=True)
    result = serializer.validated_data

我有这样的 UserSerializer

class UserSerializer(serializers.ModelSerializer):
    field1 = serializers.SerializerMethodField()
    field2 = serializers.SerializerMethodField()

    class Meta:
        model = User
        fields = (
            'username',
            'field1',
            'field2',
        )

但是我从serializer.validated_data 得到空的DefaultDict()

【问题讨论】:

  • 除非您提供 data 参数,否则您无法验证(调用 is_valid()
  • 您确定需要提供user 实例或一些dict 类似的对象吗?

标签: python django python-3.x serialization django-rest-framework


【解决方案1】:

您需要定义 serializerMethod。喜欢

class UserSerializer(serializers.ModelSerializer):
    field1 = serializers.SerializerMethodField()
    field2 = serializers.SerializerMethodField()

    class Meta:
        model = User
        fields = (
            'username',
            'field1',
            'field2',
        )

    def get_field1(self, obj):
        value = self.context['request'].data.get('field1')
        return value
    def get_field2(self, obj):
        value = self.context['request'].data.get('field2')
        return value

【讨论】:

  • 不知何故它没有在我的代码中调用 get_field1 并且我仍然得到空 OrderedDict()
  • 好的,我明白了。 searializerMethodField 默认为只读字段。每当您将 partial=True 传递给 this 时,patch 请求都会忽略这两个字段。我认为您甚至不需要模型序列化程序。如果您需要确定您真正想要什么,似乎您只想自定义序列化数据。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-19
  • 2015-03-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多