2014-03-05 157 views
4

我正在用drf-nested-routers包構建嵌套API。帶有drf嵌套路由器的Django-rest-framework嵌套網址

然而/domains/1/nameservers/給了我所有的域名服務器我有,不僅是一個關係到區域#1

我認爲問題是,我使用默認的教程NameServerViewSet實現

class NameserverViewSet(viewsets.ModelViewSet): 
    queryset = Nameserver.objects.all() 
    serializer_class = NameserverSerializer 

請幫我正確的代碼它辦法。

以下是來自drf-nested-routers github page的示例。

DRF-嵌套的路由器提供了生成低於

\域\ <網址模式嵌套路由器 - 域列表\域{PK} \ < - 一個域,從{PK]

\域{domain_pk} \域名服務器\ < - 域名服務器域的從

{domain_pk} \ {域domain_pk} \域名服務器\ {PK} \ < - 從{domain_pk}從{PK}具體名稱服務器,域的

下面是一個例子:

# urls.py 
from rest_framework_nested import routers 
from views import DomainViewSet, NameserverViewSet 
(...) 

router = routers.SimpleRouter() 
router.register(r'domains', DomainViewSet) 

domains_router = routers.NestedSimpleRouter(router, r'domains', lookup='domain') 
domains_router.register(r'nameservers', NameserverViewSet) 

urlpatterns = patterns('', 
    url(r'^', include(router.urls)), 
    url(r'^', include(domains_router.urls)), 
) 

回答

7

Solution來自Alan,作者。

這裏是視圖集應該如何實現:

class NameserverViewSet(viewsets.ViewSet): 
    queryset = Nameserver.objects.all() 

    def list(self, request, domain_pk=None): 
     queryset = self.queryset.filter(domain=domain_pk) 
     serializer = NameserverSerializer(queryset, many=True) 
     return Response(serializer.data) 

    def retrieve(self, request, pk=None, domain_pk=None): 
     queryset = self.queryset.get(pk=pk, domain=domain_pk) 
     serializer = NameserverSerializer(queryset) 
     return Response(serializer.data) 
+1

你有什麼線索什麼是錯誤配置[我的項目](http://stackoverflow.com/questions/29126707/improperly-configured-nested-resource-using-hyperlinkedmodelserializer)? – JJD

1

@Artem,我在我的代碼使用一個非常類似的解決方案。這是我做的:

我有一個實體叫Institutions。我創建了一個路線,就像這樣:

router.register(r'institutions', SecurityViews.InstitutionViewSet, base_name='institutions') 

我的網址是這樣的:

http://127.0.0.1:8000/v1/institutions/ 
http://127.0.0.1:8000/v1/institutions/1/ 

第一個URL列表的所有機構,第二是細節URL。

現在,我有我想成爲這些機構成員的人。因此,對於路線,在urls.py,我這樣做:

institutions_router = routers.NestedSimpleRouter(router, r'institutions', lookup='institution') 

institutions_router.register(r'members', SecurityViews.InstitutionMemberViewSet, base_name='institution-members') 

現在,我可以得到一個特定機構的成員具有以下網址:

http://127.0.0.1:8000/v1/institutions/1/members/ 

我也不得不定義這些關係通過串行器將主實體的pk映射到子實體。我不會在這裏發佈整個代碼,因爲我想你對這個概念很熟悉。

對我來說,@Artem提出的解決方案解決了我遇到的一個問題:返回一個過濾後的查詢。現在工作正常。

我希望這會幫助你。