2014-01-14 23 views
4

使用Django 1.6和REST框架2.路由一个REST资源作为第二剩余资源的子

我有一个URI

/rest/parent_resource/951 

下面,我想提出一个第二资源作为一个孩子这一资源,以创建,列表,获取和删除方法

/rest/parent_resource/951/child_resource 

我是新和仍然在学习,我想这个网址配置:

router.register(r'parent_resource', diliMarketplace.MarketPlaceProposalViewSet_Internal) 

再注册,我添加路由器:

url(r'^rest/parent_resource/(?P<parent_resource_pk>[0-9]+)/child_resource/$', ChildViewset.as_view()) 
url(r'^rest/', include(router.urls)), 

及以下视图集:

class ChildViewset(viewsets.ModelViewSet): 
    paginate_by = 100 

    queryset = diliModels\ 
     .ChildModel\ 
     .objects\ 
     .exclude(status=0)\ 
     .prefetch_related('parent_model')\ 
     .all() 

    serializer_class = diliSerializers.MarketPlaceProposalBidSerializer 
    permission_classes = (MyAuth.MyAuthIsAuthenticated,) 

    def get_queryset(self): 
     queryset = None 
     parent_pk = self.kwargs['parent_resource_pk'] 
     if proposal_pk is not None: 
      request = self.get_serializer_context()['request'] 
      authenticatedUserId = request.user.user_id 

      queryset = self.queryset.filter(parent_model__id = parent_pk) & \ 
         self.queryset.filter(parent_model__user__user_id = authenticatedUserId) 
     return queryset 

我正在(以我在正确的方向前进,希望)错误:

Internal Server Error: /rest/parent_resource/951/child_resource/ 
Traceback (most recent call last): 
    File "C:\Python27\lib\site-packages\django\core\handlers\base.py", line 115, in get_response 
    response = callback(request, *callback_args, **callback_kwargs) 
    File "C:\Python27\lib\site-packages\rest_framework\viewsets.py", line 69, in view 
    for method, action in actions.items(): 
AttributeError: 'NoneType' object has no attribute 'items' 

我认为URL路由器生成的REGEX过于激进,并且路由到我的p arent_resource视图集中和寻找一个@Action或@link ...


所以发生的是URL路由的路由这给parnet_resource试图找到一个child_resource @action。所以问题是如何路由到子资源视图集,而无需通过parent_resource viewset @action方法进行路由。

回答

5

真正挖掘到源和重新阅读教程,给我留下了更好的理解URL配置

url(r'^rest/parent_resource/(?P<parent_resource_pk>[0-9]+)/child_resource/$', ChildViewset.as_view({ 
     'get': 'list', 
     'post': 'create' 
    })) 

我需要太列表中as_view方法的方法。