Функция 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", потому что если вы знаете, какие поля вы ожидаете, и вы контролируете их в функции, в этом нет необходимости.