Исключение поля из вложенного сериализатора
для получения информации о пользователе я использую сериализатор с вложенными сериализаторами, но у меня есть проблема, которая заключается в том, что я не знаю, как исключить некоторые поля, которые не нужны, в данном случае пароль пользователя, есть ли способ исключить это поле?
вот код конечной точки и сериализаторов
конечная точка
@api_view(['GET'])
@has_permission_decorator('view_team_member')
def getTeamMembers(request, pk):
try:
token = decodeJWT(request)
team_member = TeamMember.objects.filter(pk=pk, company_id=token['company_id'])
print(team_member)
serializer = TeamMemberSerializer(team_member, many=True)
return Response({'data': serializer.data}, status=status.HTTP_200_OK)
except TeamMember.DoesNotExist:
return Response({'Error': 'Not Found'}, status=status.HTTP_404_NOT_FOUND)
except Exception as e:
return Response({'error': str(e)}, status=status.HTTP_500_INTERNAL_SERVER_ERROR)
сериализатор члена команды
class TeamMemberSerializer(serializers.ModelSerializer):
user = UserSerializer(read_only=True)
team = TeamSerializer(read_only=True)
team_role = TeamRoleSerializer(read_only=True)
company = CompanySerializer(read_only=True)
class Meta:
model = TeamMember
fields = "__all__"
read_only_fields = ['state', 'created_at', 'updated_at']
required_fields = ['team', 'user', 'team_role']
сериализатор пользователя
class UserSerializer(serializers.ModelSerializer):
role = serializers.CharField(style={'input_type': 'text'}, write_only=True)
password2 = serializers.CharField(style={'input_type': 'text'}, write_only=True)
class Meta:
model = User
fields = ['first_name', 'last_name', 'email', 'password', 'password2', 'company', 'role']
extra_kwargs = {
'username': {'required': True},
'email': {'required': True},
'first_name': {'required': True},
'last_name': {'required': True},
'role': {'required': True},
'company': {'required': True},
'password': {'required': True},
'password2': {'required': True},
}
def save(self):
password = self.validated_data['password']
password2 = self.validated_data['password2']
if password != password2:
raise serializers.ValidationError({'password': 'Passwords must match'})
if User.objects.filter(email=self.validated_data['email']).exists():
raise serializers.ValidationError({'Email': 'Email already exists'})
account = User(email=self.validated_data['email'],
company=self.validated_data['company'],
first_name=self.validated_data['first_name'],
last_name=self.validated_data['last_name'])
account.set_password(password)
account.save()
user = User.objects.get(id=account.id)
try:
assign_role(user, self.validated_data['role'])
except Exception as e:
user.delete()
raise serializers.ValidationError('invalid role')
ответ
{
"data": [
{
"id": 1,
"user": {
"first_name": "anderson",
"last_name": "worker",
"email": "worker@gmail.com",
"password": "pbkdf2_sha256$320000$CPoWGbsmw7xOKugwP4ygI7$4VpOy9LEDvDCWRHHn/GS6utuT9pYvtOGx+2aP7+IoI0=",
"company": 1
},
"team": {
"id": 1,
"description": "frontend-team",
"state": 1,
"created_at": "2022-08-01T00:54:05.732842Z",
"updated_at": null,
"company": 1
},
"team_role": {
"id": 1,
"description": "backend-dev",
"state": 1,
"created_at": "2022-08-01T00:54:39.197085Z",
"updated_at": null,
"company": 1
},
"company": {
"id": 1,
"description": "infinity tech",
"state": 1,
"created_at": "2022-08-01T00:51:31.420658Z",
"updated_at": null
},
"state": 1,
"created_at": "2022-08-01T01:09:07.457835Z",
"updated_at": null
}
]
}
Я хочу удалить поле пароля в объекте пользователя
Я думаю, что вы можете установить атрибут exclude
в UserSerializer
.
class UserSerializer(serializers.ModelSerializer):
...
class Meta:
...
exclude = ('password',)
...
Вы можете создать новый пользовательский сериализатор для использования с TeamMemberSerializer
.
сериализатор пользователя
class UserSerializer2(serializers.ModelSerializer):
class Meta:
model = User
fields = ['first_name', 'last_name', 'email', 'company']
сериализатор члена команды
class TeamMemberSerializer(serializers.ModelSerializer):
user = UserSerializer2(read_only=True)
team = TeamSerializer(read_only=True)
team_role = TeamRoleSerializer(read_only=True)
company = CompanySerializer(read_only=True)
class Meta:
model = TeamMember
fields = "__all__"
read_only_fields = ['state', 'created_at', 'updated_at']
required_fields = ['team', 'user', 'team_role']