2017-10-26 1 views
1

Sagen wir, ich Modell A und B habenWie erstellt man Fremdschlüssel-bezogene Objekte während des Objekt-Aufrufs mit dem Django Rest Framework?

Modell A eine Reihe von Bereichen, einschließlich eines Benutzerfeld hat, die mit dem Benutzer in die A. ein Objekt erstellt gefüllt ist

Wenn Objekt A erstellt wird, möchte ich um einen Haufen von Objekt B zu erzeugen, der den Benutzer verwendet, der das Objekt A erstellt hat und möglicherweise das Objekt A selbst als Fremdschlüssel verwendet hat.

My Model A Viewset sieht wie folgt aus:

class OrganizationViewSet(DynamicModelViewSet): 
    queryset = Organization.objects.all() 
    serializer_class = OrganizationSerializer 
    permission_classes = (IsAdminOfPermission,) 

Also, wenn eine Organisation geschaffen, die ich möchte eine Reihe von Objekt B erstellen, den Benutzer mit, dass die Organisation erstellt und möglicherweise das Organisationsobjekt mit sich.

Wie mache ich das?

Antwort

2

die Logik in dem Serializer erstellen Implementieren Methode

class OrganizationSerializer(serializers.ModelSerializer): 
    # ... 
    # ... 
    # ... 
    def create(self, validated_data): 
     user = validated_data.get('user') 
     organization = Organization.objects.create(**validated_data) 
     # create model B with `user` and `organization` 
     # like ModelB.objects.create(user=user, organization=organization, ...) 
     return organization 

Um den Benutzer aus dem Blick auf die Serializer passieren, haben Sie es durch das Verfahren der Serializer speichern zu senden.

zum Beispiel

class OrganizationList(APIView): 
    queryset = Organization.objects.all() 
    serializer_class = OrganizationSerializer 
    permission_classes = (IsAdminOfPermission,) 

    def post(self, request, format=None): 
     serializer = OrganizationSerializer(data=request.data) 
     serializer.is_valid(raise_exception=True) 
     serializer.save(user=request.user) 
     return Response(serializer.data, status=status.HTTP_201_CREATED) 
0

Dies ist vielleicht nicht der eleganteste Ansatz ... aber hier ist, wie ich es tun würde:

class DemoHandler(APIView): 
    authentication_classes = (CsrfExemptSessionAuthentication,) 
    permission_classes = (IsAuthenticated,) 

    def post(self, request, format=None): 
     m = ModelA(..., user=request.user, ...) 
     m.save() 
     m2 = ModelB(...) 
     ... 

Mit anderen Worten, ich würde nur manuell mit APIView vice einem ModelViewset definieren. Hoffentlich hat jemand einen besseren Ansatz.

+0

Als zusätzlichen Punkt, verwenden Sie 'bulk_create' auf einmal alle Ihre Instanzen Modell B zu speichern. Dies ist ungefähr so, wie Sie es tun müssen, denn um etwas als Fremdschlüsselbeziehung hinzuzufügen, muss es bereits in der Datenbank gespeichert sein. –

Verwandte Themen