我有一个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
。
答案 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)