Django Rest Framework - 如何使用 update_or_create

nut*_*les 2 python django django-rest-framework

我正在使用 Django Rest 框架。如果记录不存在,我想创建一个记录,如果存在则更新它。

我做了什么:

class MyModelList(generics.ListCreateAPIView):
    queryset = MyModel.objects.all()
    serializer_class = MyModeSerializer
    permission_classes = (permissions.IsAuthenticated,)

    def perform_create(self, serializer):
        my_model, created = MyModel.objects.update_or_create(user_id=self.request.data['user_id'],
            defaults={
                'reg_id': self.request.data['reg_id']
            })
Run Code Online (Sandbox Code Playgroud)

记录已创建或更新,但出现错误'OrderedDict' object has no attribute 'pk'。你怎么用update_or_create

Bit*_*tor 6

首先,这是一个坏主意,因为你打破了 REST API 架构风格,它期望通过 POST 创建并通过 PUT 和 PATCH 更新。

但是假设您有一个很好的理由这样做,perform_create则意味着在创建后调用以添加您在添加模型实例时需要做的其他事情。更相关的事情是在必要时覆盖 create 方法以更新对象。

我会这样做。

class MyModelList(generics.ListCreateAPIView):
    queryset = MyModel.objects.all()
    serializer_class = MyModeSerializer
    permission_classes = (permissions.IsAuthenticated,)

    def create(self, request, *args, **kwargs):
        mymodel=None
        id=request.data.get("id")
        if id:
            mymodel=self.get_object(id)

        if mymodel:
            return self.update(request, *args, **kwargs)
        else:
            return self.create(request, *args, **kwargs)
Run Code Online (Sandbox Code Playgroud)