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] からの 1 つのドメイン

\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 に答える