django-rest-framework:相同URL中的独立GET和PUT,但不同的泛型视图

时间:2014-02-28 19:46:37

标签: get django-rest-framework put

我正在使用django-rest-framework,我需要在URL文件中映射两个具有相同url的通用视图(iḿ已经使用了URL而不是Routes):

我需要在一个url(例如/ api / places / 222)中允许GET,PUT和DELETE动词,并允许每个人使用相关的Entity Place获取每个字段,但只允许更新(PUT)一个字段使用同样的网址。

放置实体:

- id (not required in PUT)
- name (required always)
- date (not required in PUT but required in POST)

URL

url(r'^api/places/(?P<pk>\d+)/?$', PlacesDetail.as_view(), name='places-detail'),

我尝试使用RetrieveDestroyAPIView和UpdateAPIView,但我无法只使用一个网址。

1 个答案:

答案 0 :(得分:16)

我建议您创建一些满足您需求的序列化程序。 然后覆盖视图的get_serializer方法,以便视图根据http请求方法切换序列化程序。

这是一个未经测试的快速示例:

class PlacesDetail(RetrieveUpdateDestroyAPIView):

    def get_serializer_class(self):
        if self.request.method == 'POST':
            serializer_class = FirstSerializer
        elif self.request.method == 'PUT':
            serializer_class = SecondSerializer

        return serializer_class
    ...

查看基类方法的评论:

def get_serializer_class(self):
    """
    Return the class to use for the serializer.
    Defaults to using `self.serializer_class`.

    You may want to override this if you need to provide different
    serializations depending on the incoming request.

    (Eg. admins get full serialization, others get basic serialization)
    """
...