【问题标题】:After overriding create function, how to the get the id of the newly created object in django?覆盖create函数后,如何在django中获取新创建对象的id?
【发布时间】:2022-01-24 14:53:47
【问题描述】:

我有一个 ModelViewSet,我想对新创建的对象执行更多操作。但我无法在这里获取新创建的对象 ID。 super()后如何获取新创建的对象id?

    def create(self, request, *args, **kwargs):
        phone = request.data.get('student_phone_number')
        batch_id = request.data.get('batch_id')
        class_number = request.data.get('class_number')
        if not any([phone, batch_id, class_number]):
            return Response({"message": "Missing Params"}, status=status.HTTP_400_BAD_REQUEST)

        if self.queryset.filter(student_phone_number=phone, batch_id=batch_id, class_number=class_number,
                                is_cancelled=False).exists():
            return Response({"message": "Compensation class already booked"}, status=status.HTTP_400_BAD_REQUEST)
        
        super().create(request, *args, **kwargs)

【问题讨论】:

  • 试过检查 super create 的返回值吗?它将返回作为创建对象的元组第一个元素。
  • 返回状态码为 201(已创建)的 HTTP 响应对象。
  • 查看create 方法的源代码,您可以简单地错过super 调用并使用序列化程序获取新创建的实例,即instance = serializer.save(),然后执行您的逻辑。顺便说一句,我建议您在同一个序列化程序中验证缺失的字段。
  • @Ersain,谢谢。你的回答真的很有帮助,在这之后,这是一个 5 秒的变化。

标签: django django-rest-framework


【解决方案1】:

你应该覆盖 ModelViewSet 上的 perform_create not create 方法

def perform_create(self, serializer):
    phone_value = self.request.data['phone']
    batch_id_value = self.request.data['batch_id']
    class_number_value = self.request.data['class_number']

    // do your condition here

    instance = serializer.save(phone=phone_value, batch_id=batch_id_value, class_number=class_number_value)
    
    instance_id = instance.id

    // do whatever you want with instance_id 

    return Response({"message": "Data Has been saved", Id:instance_id }, status=status.HTTP_201_CREATED)
    

调用 serializer.save() 应该返回刚刚创建的实例。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-19
    • 2011-08-05
    • 2015-12-19
    • 2010-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-31
    相关资源
    最近更新 更多