Django-rest-framework嵌套url与drf-nested-routers

Art*_*sov 6 django django-rest-framework drf-nested-routers

我正在使用drf-nested-routers包构建嵌套API .

但是/domains/1/nameservers/给了我所有的名字服务器,不仅仅是一个与域#1相关的名字服务器

我认为问题是我使用默认教程NameServerViewSet实现

class NameserverViewSet(viewsets.ModelViewSet):
    queryset = Nameserver.objects.all()
    serializer_class = NameserverSerializer
Run Code Online (Sandbox Code Playgroud)

请帮我正确编码.

以下是drf-nested-routers github页面的示例.

drf-nested-routers提供了嵌套路由器,可以在下面生成url模式

\ domain\< - 域名列表\域{pk}\< - 一个域名,来自{pk]

\ domain {domain_pk} \nameservers\< - 域的名称服务器

{domain_pk}\domain {domain_pk} \nameservers\{pk}\< - 来自{pk}的特定域名服务器,来自{domain_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)),
)
Run Code Online (Sandbox Code Playgroud)

Art*_*sov 9

解决方案来自作者艾伦.

以下是ViewSet的实现方式:

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)
Run Code Online (Sandbox Code Playgroud)


Ahm*_*lsi 5

不需要覆盖所有操作,您只需覆盖“ get_queryset()

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

    def get_queryset(self):
        if self.kwargs.get('domain_pk'):
            return Nameserver.objects.filter(domain=domain_pk)
        else:
            return super(NameserverViewSet, self).get_queryset()
Run Code Online (Sandbox Code Playgroud)