5

Lets sagen, ich habe ein Modell wie folgt:verschiedene Validierung in DRF Serializer pro Anforderungsverfahren

class MyModel(models.Model): 
    first_field = models.CharField() 
    second_field = models.CharField() 

und eine API Ansicht wie folgt:

class MyModelDetailAPI(GenericAPIView): 
    serializer_class = MyModelSerializer 
    def patch(self, request, *args, **kwargs): 
     # Do the update 
    def post(self, request, *args, **kwargs): 
     # Do the post 

Die first_field ist ein Feld, das nur eingelegt ist in der POST-Methode (und ist obligatorisch), aber bei jeder Aktualisierung kann der Benutzer seinen Wert nicht ändern, daher ist das Feld in der PATCH-Methode nicht obligatorisch.
Wie kann ich meinen Serializer schreiben, so dass die first_field ist für POST erforderlich, aber nicht auf PATCH erforderlich. Gibt es eine Möglichkeit, das erforderliche Feld dynamisch zu setzen, damit ich den DRF-Validierungsmechanismus weiterhin verwenden kann? Eine Art Validator-Dispatcher pro Anfrage-Methode?
Ich möchte so etwas wie dies zum Beispiel:

class MyModelSerializer(serializers.ModelSerializer): 
    class Meta: 
     model = MyModel 
     fields = { 
        'POST': ['first_field'] 
        'PATCH': [] 
       } 
+0

Wenn das Datenformat ist nicht das gleiche, es ist nicht das gleiche Serializer ist. Machen Sie einfach zwei verschiedene Serialisierer (wahrscheinlich erbt der andere oder erbt beide eine gemeinsame Basis). – spectras

+0

Mein Verständnis von Serialisierer ist, dass sie die Serialisierung von Rohdaten zu einer Modellinstanz und von einer Modellinstanz zu Rohdaten (JSON zum Beispiel) behandeln sollen. Die Tatsache, dass PATCH ein Teilupdate ist, kann viele verschiedene Permutationen von gesendeten Daten haben - es ist nicht logisch, einen anderen Serialisierer pro Permutation zu haben. –

+0

Was meinst du mit "Permutation"? Objekte sind nicht geordnet, daher kann ihr Inhalt nicht permutiert werden. Wie auch immer, Sie wollen hier ein Feld hinzufügen oder entfernen. Es ist also nicht das gleiche Format. – spectras

Antwort

4

ich mehr Platz brauchen als Kommentare meine Bedeutung klar zu machen, bieten. Also hier ist was ich schlage vor:

  1. Unterschiedliche Formatierung bedeutet verschiedene Serialisierer.

    Also hier haben Sie zum Beispiel eine MyModelSerializer und eine MyModelCreationSerializer. Entweder kreieren Sie sie unabhängig, oder sie erben die andere und spezialisieren sie (wenn es sinnvoll ist).

  2. Verwenden Sie den entsprechenden GenericAPIView Hook, um die korrekte Serializer-Klasse abhängig von self.action zurückzugeben. Ein sehr einfaches Beispiel könnte sein:

    class MyModelDetailAPI(GenericAPIView): 
        # serializer_class = unneeded as we override the hook below 
    
        def get_serializer_class(self): 
         if self.action == 'create': 
          return MyModelCreationSerializer 
         return MyModelSerializer 
    

    Standardaktionen in regelmäßigen Viewset here dokumentiert sind, sind sie:

    • create: POST-Methode auf URL-Basisstrecke
    • list: GET-Methode auf Basis Route url
    • retrieve: GET-Methode auf Objekt URL
    • update: PUT-Methode auf o bject url
    • partial_update: PATCH Methode auf Objekt url
    • destroy: DELETE-Methode auf Objekt url
Verwandte Themen