【问题标题】:Hide nested field from result从结果中隐藏嵌套字段
【发布时间】:2016-06-25 09:44:25
【问题描述】:

我正在使用 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_fieldspassword 没有任何影响;它总是返回。

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

【问题讨论】:

    标签: django serialization django-rest-framework


    【解决方案1】:

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

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

    我不知道为什么 write_only_fieldsextra_kwargs 不起作用。

    【讨论】:

      【解决方案2】:

      它不起作用,因为 Meta 类的 write_only_fields 属性仅覆盖隐式字段(仅在 Metafields 属性中列出的字段,并且未在 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",)
      

      【讨论】:

        【解决方案3】:

        您还可以覆盖构建嵌套字段的函数。当您想在嵌套的 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
        

        【讨论】:

          猜你喜欢
          • 2017-08-09
          • 2016-03-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-12-30
          • 2020-04-11
          相关资源
          最近更新 更多