【问题标题】:Using a single URL for GET and POST with Django REST Framework list_route使用 Django REST Framework list_route 的单个 URL 进行 GET 和 POST
【发布时间】:2016-05-27 04:20:20
【问题描述】:

DRF 中的 ModelViewSet 非常有用,但我正在尝试扩展其中一个,以便能够在 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'),

但这也没有用。

我曾考虑使用相同的 URL 单独使用 list_routes,但这似乎不受支持,尽管我可能遗漏了文档中的某些内容。

感谢您的帮助!

【问题讨论】:

    标签: python django django-rest-framework


    【解决方案1】:

    ViewSetactions 参数是一个字典,所有方法都在该字典中:

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

    【讨论】:

    • 每当我尝试将多个对象发布到 list_route 操作时,都会收到 JSON 错误:"detail": "JSON parse error - Extra data: line 90 column 6 - line 181 column 2 (char 3683 - 7375)"。 (此位置对应于第一个对象的末尾)。是否可以以这种方式处理对象列表?
    猜你喜欢
    • 1970-01-01
    • 2016-05-27
    • 1970-01-01
    • 2014-10-03
    • 2020-06-07
    • 1970-01-01
    • 2018-03-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多