django rest框架中从视图到序列化器类的代码流



我正在尝试理解Django rest框架中从视图类到序列化器类的代码流。就像我们知道的,如果我们创建一个类的对象,这个类就会用这个对象实例化。如果在这个类中还有其他函数,我们可以使用刚刚创建的对象,后跟点和函数名来调用该函数。

它看起来像这样。

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实例化。然后我们可以调用细节函数使用我们刚刚创建的类对象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:
model = Lead
fields = '__all__'
def update(self,instance,validated_data):
..........
print("iam inside the serializer class")
return instance

在这里,我试图使django代码类似于简单的类对象,因为这是我们应该学习的方式,但似乎没有人这样教。在这里,我认为序列化器类是在这行代码serializer = LeadSerializer(abc,data=request.data)中实例化的,其中数据是反序列化的,而abc是序列化的。

然而,就像上面的简单类对象的情况一样,我没有使用我创建的序列化器对象调用序列化器类的任何更新函数。那么这里如何调用update函数呢?

同样,打印输出如下所示:

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

在这里看到输出模式,我们知道只有在保存函数之后,更新函数才会运行。

当您在模型序列化器的实例上调用serializer.save()时,您将最终运行更新模型实例的代码,并运行更新函数(self.update())。

这是ModelSerializer内部save()函数的一部分代码:

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

最新更新