Функция init внутри класса сериализатора в django rest framework

Это скорее вопрос понимания, чем вопрос кода. Я наткнулся на фрагмент кода другого человека, который использовал функцию init внутри класса сериализатора. Мне нужно было написать код обновления. Я написал переопределение метода update внутри класса сериализатора, которое выглядит следующим образом:

class ProfileInfoApiview(UpdateAPIView):
    serializer_class = ProfileInfoSerializer

    def get_object(self):
        return self.request.user

Мой сериализатор, который я написал:

class ProfileSerializer(serializers.ModelSerializer):
    class Meta:
        model = User
        fields = ["name", "mobile","user_type"]

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        print("iam init")
        for field in self.fields:
            self.fields[field].required = True

    def update(self, instance, validated_data):
        print("iam update")
        user = instance
        user_type = validated_data.get("user_type")
        if user_type:
            if user_type == "student":
                Student.objects.create(user=user)
            if user_type == "parent":
                Parent.objects.create(user=user)
            if user_type == "teacher":
                Teacher.objects.create(user=user)
        instance.save()
        super(ProfileSerializer,self).update(instance,validated_data)
        return instance

Путаница здесь заключается в функции init, которая была написана выше. Я просто написал функцию update. Функция init уже была там. Даже если я удалю функцию init, она работает как ожидалось, и даже если я оставлю ее там, она работает нормально. Команда print работает, что означает, что init работает. Но для чего она нужна? Если она что-то делает, почему она работает, когда я ее удалил? Когда вызывается функция init в сериализаторе? Я знаю, что функция init вызывается при создании экземпляра в общем python, но не могу связать это с этим.

Это способ узнать, какие поля должны быть обновлены в функции "update". Например, в вашем случае у вас есть:

fields = ["name", "mobile", "user_type"]

Это означает, что единственными полями, которые вы ожидаете, являются эти 3. Это может быть полезно при обновлении с помощью "self.fields", чтобы знать, какие из них нужно обновить из Модели: "Пользователь". Это особенно полезно, если модель имеет гораздо больше полей, чем 3 указанных, поэтому вы должны обновить только те, которые определены в "fields".

Вы не можете использовать "init", потому что если вы знаете, какие поля вы ожидаете, и вы контролируете их в функции, в этом нет необходимости.

Вернуться на верх