Django Rest框架:同一URL实现独立的GET和PUT,但使用不同的通用视图

16

我正在使用django-rest-framework,我需要在URL文件中映射两个通用视图,并使用相同的URL(我已经在使用URL但不是Routes):

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

Place实体:

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

网址

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

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

1个回答

22

我建议您创建一些满足您需求的序列化程序。然后,覆盖视图的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)
    """
    ...

安德烈,这是一个好主意!我不知道get_serializer_class。 - Juan Saravia
是的,当然!它真的很有帮助!谢谢 @andrey-kaygorodov - Juan Saravia

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接