通过Django Rest Framework更新对象

时间:2017-07-22 21:53:56

标签: python django django-models django-rest-framework

我有一个Django Rest Framework设置,可以正确地提供GET请求。在此处询问上一个问题后,它还应该能够正确更新对象。但是,我不确定如何只更新模型对象中的一个字段。我有这样的Model ViewSet:

class TaskViewSet(viewsets.ModelViewSet):
    queryset = Task.objects.filter(done = False).order_by('-unixTime')
    serializer_class = TaskSerializer
    paginate_by = None

我通过这样的路由器注册了网址:

router = routers.DefaultRouter()
router.register(task', views.TaskViewSet)
urlpatterns = [
    url(r'^', include(router.urls)),
    url(r'^api-auth/', include('rest_framework.urls', namespace='rest_framework'))
]

序列化程序与现在基本相同:

class TaskSerializer(serializers.ModelSerializer):

    class Meta:
        model = Task
        fields = ('id', 'user', 'task', 'unixTime', 'done')

我希望能够更新完成的'由主键ID标识的Task对象的字段。我想我需要使用partial_update模型或路径,但我不确定如何实现它。另外,为了提供更多信息,DRF浏览器视图说允许的HTTP方法是GET, POST, HEAD, OPTIONS

1 个答案:

答案 0 :(得分:1)

如果您使用的是ModelViewSet,只需将put添加到您的网址as_view()参数中。

你的网址应该有这样的东西:

TaskViewSet.asView({'get': 'retrieve', 'put': 'update'})

即:

url(r'^your-regex$', TaskViewSet.asView({'get': 'retrieve', 'put': 'update'}), name='whatever')

然后,您可以使用requests.put进行更新。

如果您想覆盖更新方法,可以将这些添加到ViewSet中:

def update(self, request, *args, **kwargs):
    # Perform your custom actions here and probably call:
    super(TechyRetrieveUpdate, self).update(request, *args, **kwargs)