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)
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
或者浏览此链接
| 归档时间: |
|
| 查看次数: |
22420 次 |
| 最近记录: |