【问题标题】:flow of code from view to serializer class in django rest frameworkdjango rest框架中从视图到序列化器类的代码流
【发布时间】:2021-10-23 19:57:01
【问题描述】:

我试图了解 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调用details函数。

现在在 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是序列化的。

但是,就像上面简单的类对象案例一样,我没有使用我创建的序列化器对象调用序列化器类的任何更新函数。那么这里怎么调用更新函数呢??

另外,打印输出如下:

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

在这里看到输出模式,我们知道只有在保存功能之后,更新功能才似乎在运行。

【问题讨论】:

    标签: python django django-rest-framework instance django-serializer


    【解决方案1】:

    当您在模型序列化程序的实例上调用 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
    

    【讨论】:

    • 感谢古斯塔沃的回答。你知道这里的代码在做什么吗? assert self.instance is not None, ( 'create() did not return an object instance.' ) 里面有个逗号,括号开头是create()
    • 断言不为真时显示的错误信息。例如:AssertionError: create() 没有返回对象实例。
    猜你喜欢
    • 2016-02-17
    • 2015-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-22
    • 2015-10-29
    • 2020-05-08
    • 2013-11-28
    相关资源
    最近更新 更多