Поток кода от представления к классу сериализатора в django rest framework

Я пытаюсь понять поток кода в Django rest framework от класса представления до класса сериализатора. Как мы знаем, если мы создаем объект класса, класс инстанцируется с этим объектом. И если внутри этого класса есть другие функции, мы можем вызвать эту функцию, используя только что созданный объект, за которым следует точка и имя функции.

Выглядит это примерно так.

class Person:

    def __init__(self, name, address):
        self.name = name
        self.address = address

    def details(self):
        print (f"My name is {self.name} and I live in {self.address}")

obj1 = Person("John","London")
obj1.details()
   

Например, в приведенном выше коде, когда мы выполним obj1= .... будет создан класс person со значениями name и address. И тогда мы сможем вызвать функцию details, используя объект класса, который мы только что создали obj1.

Теперь в Django Rest,

class LeadsView(APIView):
    permission_classes = [IsAuthenticated]

def put(self, request, pk=None, *args, **kwargs):
    id = pk
    abc = Lead.objects.get(id=id)
    print("before serializer")       
    serializer = LeadSerializer(abc,data=request.data)
    if serializer.is_valid():
        print("after serializer validation") 
        serializer.save()
        print("after save") 
        return Response({
            "message": "Coupon hase been updated",
            "data": serializer.data
        }, status=status.HTTP_200_OK)
    return Response(serializer.data)

class Leadserializer(serializers.ModelSerializer): class Meta: модель = Lead поля = 'all'

 def update(self,instance,validated_data):
     ..........
     print("iam inside the serializer class")
     return instance

Здесь я пытаюсь сделать код django аналогом простого объекта класса, потому что именно так мы должны учиться, но, похоже, никто не учит таким образом. Здесь я думаю, что класс serializer инстанцирован в этой строке кода serializer = LeadSerializer(abc,data=request.data), где данные десериализуются, в то время как abc сериализуется.

Однако, как и в случае с простым объектом класса, я не вызывал никакой функции обновления класса сериализатора, используя созданный мной объект сериализатора. Так как же здесь вызывается функция обновления?

Кроме того, вывод на печать выглядит следующим образом:

before serializer
after serializer validation
iam inside the serializer class
after save

Здесь, видя выходной шаблон, мы поняли, что только после функции сохранения, функция обновления, похоже, выполняется.

Когда вы вызываете serializer.save() на экземпляре модели сериализатора, вы в итоге запускаете код, который обновляет экземпляр модели и запускает функцию обновления (self.update()).

Это часть кода для функции save() внутри ModelSerializer:

    validated_data = {**self.validated_data, **kwargs}

    if self.instance is not None:
        self.instance = self.update(self.instance, validated_data)
        assert self.instance is not None, (
            '`update()` did not return an object instance.'
        )
    else:
        self.instance = self.create(validated_data)
        assert self.instance is not None, (
            '`create()` did not return an object instance.'
        )

    return self.instance
Вернуться на верх