我使用的是django-rest-framework。我有一个带有嵌套数据的序列化程序,我想隐藏一个特定的字段(密码):
class MyUser(models.Model):
# django's auth model
user = models.OneToOneField(User)
class MyUserSerializer(serializers.ModelSerializer):
username = serializers.CharField(source="user.username")
password = serializers.CharField(source="user.password")
# Other fields related to MyUser model
class Meta:
model = MyUser
fields = ( ..., "password")
write_only_fields = ("password",)
第一个问题是,如果我从fields
中删除密码,它会错误地说我已经定义了password
,但在fields
列表中找不到它。
write_only_fields
对password
没有任何影响;它总是被返回。
有没有办法将密码保留为只写并将其从结果中删除?
发布于 2016-06-25 18:12:31
我通过删除write_only_fields
并将字段本身修改为write_only解决了这个问题:
password = serializer.CharField(source="user.password", write_only=True)
。
我不知道为什么write_only_fields
和extra_kwargs
不能工作。
发布于 2016-06-27 12:26:33
它不起作用,因为Meta
类的write_only_fields
属性只覆盖了隐式字段(只在Meta
类的fields
属性中列出,没有在ModelSerializer
作用域中定义的字段) write_only
属性为True
。如果显式声明了ModelSerializer
字段,则必须定义所有非默认属性才能使其正常工作。
正确的代码应该是这样的:
class MyUser(models.Model):
# django's auth model
user = models.OneToOneField(User)
class MyUserSerializer(serializers.ModelSerializer):
username = serializers.CharField(source="user.username")
password = serializers.CharField(source="user.password", write_only=True)
# Other fields related to MyUser model
class Meta:
model = MyUser
fields = ( ..., "password")
write_only_fields = ("password",)
发布于 2018-06-01 05:38:57
您还可以覆盖构建嵌套字段的函数。当您想要在嵌套ListView中显示默认的auth_user名称时,这是一个很好的选择。
from rest_framework.utils.field_mapping import get_nested_relation_kwargs
def build_nested_field(self, field_name, relation_info, nested_depth):
"""
Create nested fields for forward and reverse relationships.
"""
class NestedSerializer(serializers.ModelSerializer):
class Meta:
model = relation_info.related_model
depth = nested_depth - 1
fields = ['username'] # Originally set to '__all__'
field_class = NestedSerializer
field_kwargs = get_nested_relation_kwargs(relation_info)
return field_class, field_kwargs
https://stackoverflow.com/questions/38027101
复制相似问题