如果queryset存在,请更新序列化程序

时间:2016-01-07 04:26:28

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

如果查询集存在,我想更新现有实例,而不是创建一个全新的实例。

我目前拥有它的方式引发了一个错误,即如果序列化程序正在尝试更新,则会传递意外的kwargs。

有人可以帮我这么做吗?

class APNSDeviceViewSet(DeviceViewSetMixin, ModelViewSet):
    queryset = APNSDevice.objects.all()
    serializer_class = APNSDeviceSerializer

    def perform_create(self, serializer):
        queryset = APNSDevice.objects.filter(user=self.request.user)
        if queryset.exists():
            # update serializer to contain new information
            serializer.update(
                device_type=self.request.data.get('device_type'),
                registration_id=self.request.data.get('registration_id'),
                device_id=self.request.data.get('device_id'))
        else:
            # create a new model instance
            serializer.save(
                user=self.request.user,
                device_type=self.request.data.get('device_type'),
                registration_id=self.request.data.get('registration_id'),
                device_id=self.request.data.get('device_id'))

谢谢!

2 个答案:

答案 0 :(得分:0)

深入研究Django Rest Framework代码,特别是serializers.py,很明显你为update()方法提供了错误的参数。它的签名与save()方法的签名不同。它期望作为第一个参数的模型实例,并作为第二个参数包含数据的字典。所以在你的情况下,它看起来像这样:

instance = queryset[0]
serializer.update(instance, {'device_type': self.request.data.get('device_type'), 'registration_id': self.request.data.get('registration_id'), 'device_id': self.request.data.get('device_id')})

答案 1 :(得分:0)

您想要的只是一个仅限当前用户的基本查询集。 这是由the filters以优雅而简单的方式执行的。

另一方面,你不应该自己调用serializer.update。它由串行器通过serializer.save方法调用。 update et create之间的区别在于序列化程序是使用Model的实例进行实例化的。