首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >从结果中隐藏嵌套字段

从结果中隐藏嵌套字段
EN

Stack Overflow用户
提问于 2016-06-25 17:44:26
回答 3查看 581关注 0票数 0

我使用的是django-rest-framework。我有一个带有嵌套数据的序列化程序,我想隐藏一个特定的字段(密码):

代码语言:javascript
复制
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_fieldspassword没有任何影响;它总是被返回。

有没有办法将密码保留为只写并将其从结果中删除?

EN

回答 3

Stack Overflow用户

发布于 2016-06-25 18:12:31

我通过删除write_only_fields并将字段本身修改为write_only解决了这个问题:

password = serializer.CharField(source="user.password", write_only=True)

我不知道为什么write_only_fieldsextra_kwargs不能工作。

票数 0
EN

Stack Overflow用户

发布于 2016-06-27 12:26:33

它不起作用,因为Meta类的write_only_fields属性只覆盖了隐式字段(只在Meta类的fields属性中列出,没有在ModelSerializer作用域中定义的字段) write_only属性为True。如果显式声明了ModelSerializer字段,则必须定义所有非默认属性才能使其正常工作。

正确的代码应该是这样的:

代码语言:javascript
复制
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",)
票数 0
EN

Stack Overflow用户

发布于 2018-06-01 05:38:57

您还可以覆盖构建嵌套字段的函数。当您想要在嵌套ListView中显示默认的auth_user名称时,这是一个很好的选择。

代码语言:javascript
复制
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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38027101

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档