如果查询集存在,我想更新现有实例,而不是创建一个全新的实例。
我目前拥有它的方式引发了一个错误,即如果序列化程序正在尝试更新,则会传递意外的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'))
谢谢!
答案 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的实例进行实例化的。