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": ""
}
Вернуться на верх