Django Rest Framework Манипулирование Serialize.pop
Я пытаюсь сделать функцию представления, которая выполняет необходимую операцию в зависимости от данных, поступающих из тела. Есть сериализатор регистрационной модели, который принимает дополнительную переменную group и если группа студенческая, то в начале идентификатора института будет стоять "ST22". Я не смог найти способ вытащить 'group' из сериализатора перед отправкой в базу данных. Данные сохраняются, но так как он отправляет также и группу, а у нее нет поля, он выдает ошибку.
функция поста:
def post(self, request, format='json'):
serializer = RegistrationSerializer(data=request.data)
if serializer.is_valid():
if (serializer.validated_data["group"].lower() == "student"):
serializer.validated_data["institute_id"]= "ST22" + serializer.validated_data["institute_id"]
user = serializer.save()
if user:
return Response(serializer.data, status=status.HTTP_201_CREATED)
return Response(serializer.errors, status= status.HTTP_418_IM_A_TEAPOT)
класс сериализатора:
class StudentRegistrationSerializer(serializers.ModelSerializer):
group = serializers.CharField()
class Meta:
model= CustomUser
fields= ("id", "username", "password", "institute_id", "group")
extra_kwargs = {
'password': {
'write_only': True
}
}
def create(self, validated_data):
password = validated_data.pop('password')
password = validated_data.pop('group')
user = CustomUser(**validated_data)
user.set_password(password)
user.save()
return user
Вам следует отметить поле группы как доступное только для чтения, таким образом, оно не будет использоваться для создания или обновления экземпляров:
class StudentRegistrationSerializer(serializers.ModelSerializer):
group = serializers.CharField()
class Meta:
model= CustomUser
fields= ("id", "username", "password", "institute_id")
read_only_fields = ("group")
extra_kwargs = {
'password': {
'write_only': True
}
}
group: str
вместо
group = serializers.CharField()
Вы можете получить доступ к группе, используя request.data, и вам не нужно будет работать с сериализатором. Вы можете отправить запрос внутри body следующим образом:
{
"username": "",
"password": "",
"institute_id": "",
"group": ""
}