2016-04-29 14 views
1

Ich habe zwei Modelle Patient und Docter.Django Rest Framework: Wie Rest API-Endpunkt für ein geschachtelte Modelle [ManyToMany Felder] hinzufügen?

# models.py 
class Docter(models.Model): 
    ... 

class Patient(models.Model): 
    ... 
    cared_by = models.ManyToManyField(Docter) 

Jetzt habe ich und ModelViewSet, die die grundlegenden CRUD-Operationen für das Modell Griff User.

#viewsets.py 
class PatientViewSet(viewsets.ModelViewSet): 
    """ 
    API endpoint that allows patients to be viewed or edited. 
    """ 

    queryset = Patient.objects.all() 
    serializer_class = PatientSerializer 
    permission_classes = (permissions.IsAuthenticated,) 

    def get_queryset(self): 
     return Patient.objects.filter(cared_by__in = [self.request.user]) 

    # Automatically add to cared by when creating object 
    def perform_create(self, serializer): 
     serializer.save(cared_by = [self.request.user]) 

und ich kann auf diese Ansicht mit dem /users/ Endpunkt zugreifen. Jetzt möchte ich diesen Endpunkt erweitern, um grundlegende CRUD-Operationen für das cared_by Feld auf Patient Modell durchzuführen.

Damit wird /users/2/docters ein anderer Endpunkt.

POST /users/2/docters/ tun können patientinstance.cared_by.add(docter)

GET /users/2/docters/ zurückkehren können patientinstance.cared_by.all()

/users/2/docters/5 DELETE kann patientinstance.cared_by.remove(docter) tun

Aber jetzt die einzige Art, wie ich dies zu tun ist, um durch das Hinzufügen von benutzerdefinierten @detail_routes einfiel die PatientViewSet. Das sieht nach einer sehr schlechten Übung aus und ich wiederhole viel Code.

Also kann mir bitte jemand sagen, wie man das richtig macht.

+0

Lieber Darwesh, hat meine Lösung Ihnen geholfen? – iulian

Antwort

1

Was Sie tun möchten, ist mit verschachtelten Ressourcen zu arbeiten. Dazu gibt es ein Drittanbieter-Modul namens drf-nested-routers, mit dem Sie erreichen können, was Sie wollen.

In Ihrem Fall würden Sie etwas ähnliches haben:

router = DefaultRouter() 
router.register(r'users', PatientViewSet, basename='users') 

doctors_router = routers.NestedSimpleRouter(router, r'users' lookup='user') 
doctors_router.register(r'doctors', DoctorViewSet, base_name='doctors') 

dass Sie die folgenden Routen bieten:

/users/ 
/users/{pk}/ 
/users/{user_pk}/doctors/ 
/users/{user_pk}/doctors/{doctor_pk}/ 

seine Dokumentation für weitere Details prüfen.

Verwandte Themen