使用Django REST Framework list_route为GET和POST使用单个URL

时间:2016-02-16 03:36:06

标签: python django django-rest-framework

DRF中的ModelViewSets非常有用,但我尝试扩展其中一个以便能够在GET请求中返回对象列表,并在POST请求中处理列表。到目前为止,似乎我需要使用@list_route装饰器来添加此功能。

我已经习惯使用它来在其他视图集中添加自定义路由,但这是我第一次尝试添加一个接受多个方法的路径。这就是我到目前为止所拥有的:

class PickViewset(viewsets.ModelViewSet):

  queryset = Pick.objects.all()
  serializer_class = PickSerializer

  def get_queryset(self):
    #gets the correct queryset

  @list_route(methods=['get', 'post'])
  def update_picks(self, request, league, week, format = None):
    if request.method == 'POST':
        #process/save objects here
    else:
        #otherwise return the requested list

我认为这是有效的,我的问题出在urls.py - 这里是相关内容:

#bind the pick methods explicitly
update_picks = PickViewset.as_view({'get': 'update_picks'})

url(r'^api/picks/(?P<league>[\w ]+)/(?P<week>[0-9]+)/$', update_picks, name='update_picks')

这适用于GET请求,如果我将update_picks定义更改为

update_picks = PickViewset.as_view({'get': 'update_picks'})

然后我可以从Viewset进入POST代码。要将GET和POST请求路由到update_picks操作,我需要做什么,然后可以使用请求方法区分它们?

我尝试在as_view()中添加, {'post': 'update_picks'},但这并不起作用。

我也尝试添加

get_picks = PickViewset.as_view({'get': 'update_picks'})

使用新的网址格式

url(r'^api/picks/(?P<league>[\w ]+)/(?P<week>[0-9]+)/$', get_picks, name='get_picks'),

但这也不起作用。

我考虑将具有相同网址的list_routes分开,但似乎不支持,但我可能错过了文档中的内容。

感谢您的帮助!

1 个答案:

答案 0 :(得分:2)

actions的{​​{1}}参数是一个dict,所有方法都在dict中:

ViewSet