在DRF 3中的ModelSerializer上添加非模型字段

Pro*_*eus 28 python django django-rest-framework

如何在DRF 3中的ModelSerializer上添加非模型字段?即添加我的实际模型中不存在的字段?

class TestSerializer(serializers.ModelSerializer):
    url = serializers.HyperlinkedIdentityField(view_name='vote_detail')
    non_field = serializers.CharField()  # no corresponding model property.


    class Meta:
        model = vote_model
        fields = ("url", "non_field")

    def create(self, validated_data):
      print(direction=validated_data['non_field'])
Run Code Online (Sandbox Code Playgroud)

但是DRF 3给了我错误:

Got AttributeError when attempting to get a value for field `non_field` on serializer `TestSerializer`.
The serializer field might be named incorrectly and not match any attribute or key on the `Test` instance.
Original exception text was: 'Test' object has no attribute 'non_field'.
Run Code Online (Sandbox Code Playgroud)

我已经使用非模型write_only字段搜索了堆栈DRF - ModelSerializer,并找到了一些解决方案,但这些解决方案是指我正在使用DRF 3的DRF 2.这个版本是否有解决方案?

A. *_*arr 52

class MySerializer(serializers.ModelSerializer):
    write_only_char_field = serializers.CharField(write_only=True)
    write_only_list_char_field = serializers.ListField(child=serializers.CharField(max_length=100, default=''), write_only=True)
    empty_method_field = serializers.SerializerMethodField()
    read_only_custom_model_field = serializers.CharField(source='custom_property', read_only=True)

    def create(self, validated_data):
        validated_data.pop('write_only_char_field', None)
        validated_data.pop('write_only_list_char_field', None)
        return super().create(validated_data)
Run Code Online (Sandbox Code Playgroud)

serializers.CharField(write_only=True)serializers.ListField(...)是一个很好的解决方案,以提供额外的数据到你.create().update()方法,无论是作为单个字符串或字符串列表(你可以混合ListField与其他串行字段类型).使用此方法,您还可以定义def validate_write_only_char_field实现一些快速简单的验证.

serializers.SerializerMethodField() 允许您从序列化程序中定义的方法向序列化程序输出添加一些自定义只读字段.

read_only_custom_model_field会使用在你的模型的方法来读取一些数据,不是严格意义上的模型领域,但自定义方法.即

class MyModel(models.Model):
    my_field = models.CharField(max_length=100)

    @property
    def custom_property(self):
        return "Perform calculations, combine with related models, etc. etc."
Run Code Online (Sandbox Code Playgroud)

  • 我发现(太晚了)关于只写非模型字段的唯一问题。您最终可能会在`validate`方法中弹出键,也许更合适 (3认同)
  • `write_only` 正是我所需要的。谢谢 (3认同)
  • 这是最完整的答案,完美〜 (2认同)
  • 非常感谢@ARJMP (2认同)

cha*_*ndu 0

class TestSerializer(serializers.ModelSerializer):
    url = serializers.HyperlinkedIdentityField(view_name='vote_detail')
    non_field = serializers.SerializerMethodField()  # no corresponding model property.

    class Meta:
        model = vote_model
        fields = ("url", "non_field")

    def create(self, validated_data):
        print(direction=validated_data['non_field'])
Run Code Online (Sandbox Code Playgroud)

http://www.django-rest-framework.org/api-guide/fields/#serializermethodfield

或者浏览此链接

  • 这个答案是错误的。上面的链接 https://www.django-rest-framework.org/api-guide/fields/#serializermethodfield 中提到的第一件事是 SerializerMethodField 是一个只读字段。 (9认同)
  • 我正在尝试做同样的事情,但我有一个错误告诉我,我的模型没有这个字段.有没有人找到解决方案? (2认同)