9

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

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

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

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

请帮我正确编码。

下面是来自drf-nested-routers github 页面的示例。

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

\domain\ <- 域列表 \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)),
)
4

3 回答 3

11

解决方案来自作者艾伦

下面是 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)
于 2014-03-06T05:33:32.347 回答
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()
于 2020-04-06T08:22:41.827 回答
2

@Artem,我在我的代码中使用了一个非常相似的解决方案。这是我所做的:

我有一个名为机构的实体。我为它创建了一条路线,如下所示:

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')

现在,我可以通过以下 URL 获取特定机构的成员:

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

我还必须定义关系,通过序列化程序将主实体的 pk 映射到子实体。我不会在这里发布整个代码,因为我想你对这个概念很熟悉。

对我来说,@Artem 提出的解决方案解决了我遇到的一个问题:返回过滤后的查询。现在工作正常。

我希望这能帮到您。

于 2017-01-25T22:30:16.553 回答