2016-10-03 3 views
1

Ich bin neu mit Django und Django rest framework, ich versuche, mehrere Routen zu erstellen, um die Daten aus der Datenbank zu erhalten.mehrere Parameter in Django Rest Framework übergeben

Gerade jetzt in meiner urls.py Datei habe ich diese

router = routers.DefaultRouter() 
router.register(r'cpuProjects', cpuProjectsViewSet, base_name='cpuProjects'), 

diese Rückkehr diese

"cpuProjects": "http://127.0.0.1:8000/cpuProjects/" 

und ich habe die Möglichkeit, diese http://127.0.0.1:8000/cpuProjects/ => Rückkehr alle Projekte http://127.0.0.1:8000/cpuProjects/ad => Rückkehr zu tun ein bestimmtes Projekt.

In meinem view.py Ich habe dieses

class cpuProjectsViewSet(viewsets.ViewSet): 
    serializer_class = serializers.cpuProjectsSerializer 
    # lookup_field = 'project_name' 
    lookup_url_kwarg = 'project_name' 

    def list(self, request): 
    all_rows = connect_database() 
    serializer = serializers.cpuProjectsSerializer(instance=all_rows, many=True) 
    return Response(serializer.data) 

    def retrieve(self, request, project_name=None): 
    try: 
     opc = {'name_proj' : project_name } 
     all_rows = connect_database(opc) 
    except KeyError: 
     return Response(status=status.HTTP_404_NOT_FOUND) 
    except ValueError: 
     return Response(status=status.HTTP_400_BAD_REQUEST) 
    serializer = serializers.cpuProjectsSerializer(instance=all_rows, many=True) 
    return Response(serializer.data) 

Jetzt möchte ich, dass meine URL etwas wie das http://127.0.0.1:8000/cpuProjects/ad/ussing http://127.0.0.1:8000/cpuProjects/ad/process

Dazu

http://127.0.0.1:8000/cpuProjects/ad/comments akzeptierte ich diese neue URL hinzufügen

router.register(r'cpuProjects/([a-zA-Z0-9]+)$', cpuProjectsViewSet, base_name='cpuProjects'), 
jetzt

aber wenn ich versuche, diese

http://127.0.0.1:8000/cpuProjects/ad/ussing 

I „Seite nicht gefunden“ erhalten

ich verstanden, dass diese URL-Funktion abrufen aufrufen müssen, um die Parameter zu erhalten, so, warum dieser Fehler?

Diese URL nicht tun, den gleichen Prozess wie

http://127.0.0.1:8000/cpuProjects/ad 

Vielen Dank im Voraus!

Antwort

1

Dies ist etwas ähnlich zu dem, was in wir haben unsere früheren Q&A

from rest_framework.decorators import detail_route, list_route 
@detail_route(url_path='(?P<slug>[\w-]+)/(?P<what>[\w-]+)') 
def get_by_name(self, request, pk=None,slug=None, what=None): 
    print(slug, what) 

Ebenso können Sie sich für eine list_route

das gleiche tun
0

Das Router-Framework ist nicht für die Verwendung mit mehreren Parametern gedacht. Sie können dies manuell mit Primärschlüsseln (in regulären Ausdrücken) tun.

Verwandte Themen