Python DRF:如何在使用深度选项的序列化程序中隐藏密码?
我正在为Python DRF:如何在使用深度选项的序列化程序中隐藏密码?,python,django,django-rest-framework,django-serializer,drf-queryset,Python,Django,Django Rest Framework,Django Serializer,Drf Queryset,我正在为用户模型使用下面的序列化程序,但是当我使用深度处理外键时,密码显示在用户对象中 用户序列化程序: class UserSerializer(serializers.ModelSerializer): 类元: 模型=用户 只读字段=('is_active'、'is_staff'、'is_superuser',) 排除=('password',) extra_kwargs={'password':{'write_only':True,'min_length':4} 在下面的序列化程序中,一
用户
模型使用下面的序列化程序,但是当我使用深度处理外键时,密码显示在用户
对象中
用户序列化程序:
class UserSerializer(serializers.ModelSerializer):
类元:
模型=用户
只读字段=('is_active'、'is_staff'、'is_superuser',)
排除=('password',)
extra_kwargs={'password':{'write_only':True,'min_length':4}
在下面的序列化程序中,一切正常:
类AuditSerializer(serializers.ModelSerializer):
定义初始化(self,实例=None,**kwargs):
例如:
setattr(self.Meta,'depth',10)
其他:
setattr(self.Meta,'depth',0)
超级(AuditSerializer,self)。\uuuu初始化(实例,**kwargs)
启动器=UserSerializer(只读=True)
类元:
模型=审计
字段=['id','initiator']
只读字段=['id','initiator']
深度=0
但在与先前的模型/序列化程序相关的以下示例中,我遇到了密码问题:
类AuditAttachmentSerializer(serializers.ModelSerializer):
定义初始化(self,实例=None,**kwargs):
例如:
setattr(self.Meta,'depth',10)
其他:
setattr(self.Meta,'depth',0)
超级(AuditAttachmentSerializer,self)。\uuuuu初始化(实例,**kwargs)
类元:
模型=附件
字段=['id','audit']
只读字段=['id']
深度=0
我删除了\uuuu init\uuu
方法,并将其更改为以下解决方案
我在使用
depth
元属性时遇到了同样的问题。密码
集成在序列化数据中
第一种解决方案)
在原始帖子的@JPG评论之后,我使用了to_representation()
方法,它就像一个魔咒
我已经结束了与我的用户模型相关的序列化程序的代码:
来自django.contrib.auth.models导入组的
从rest_框架导入序列化程序
类BaseGroupSerializer(serializers.ModelSerializer):
类元:
模型=组
深度=1
字段=(
“id”,
“姓名”,
“用户集”,
)
def到_表示(自身、实例):
response=super().to_表示(实例)
对于响应中的用户。获取(“用户设置”):
user.pop(“密码”,无)
返回响应
它只是从我的组中的每个用户弹出密码字段
第二种解决方案)
另一个简单的解决方案是直接引用UserSerializer,您在其中明确排除了密码exclude=('password',)
(或者不包括它)
就我而言,结果会是这样的:
来自django.contrib.auth.models导入组的
从rest_框架导入序列化程序
from..serializers.base\u user\u serializer导入BaseUserSerializer
类BaseGroupSerializer(serializers.ModelSerializer):
user_set=BaseUserSerializer(many=True)#您不能通过使用depth
选项来控制字段的性质。为此,您必须使用嵌套序列化技术(正如您已经做过的那样),除此之外,还有一个简单的问题,您重写\uu init\uuuuuuuo()的目的是什么
这样的方法?@ArakkalAbu当我想按id将对象添加到ManyToManyField
时,DRF会引发错误。@ArakkalAbu在嵌套序列化技术中,对象不会添加到嵌套字段中。如果我有选择,我会使用此方法,