5

Diciamo che ho un modello in questo modo:differente validazione in drf serializzatore per richiesta metodo

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

e una vista API in questo modo:

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

Il first_field è un campo che è inserita solo nel metodo POST (ed è obbligatorio) ma su ogni aggiornamento, l'utente non può modificare il suo valore in modo che il campo nel metodo PATCH sia non obbligatorio.
Come posso scrivere il mio serializzatore in modo che lo first_field sia richiesto su POST ma non richiesto su PATCH. C'è un modo per impostare dinamicamente il campo richiesto così posso ancora usare il meccanismo di validazione DRF? Una sorta di dispatcher di validatori per metodo di richiesta?
Voglio qualcosa di simile, per esempio:

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

Se il formato dei dati non è la stessa, non è la stessa serializzatore. Basta creare due serializzatori diversi (probabilmente uno eredita l'altro o entrambi ereditano una base comune). – spectras

+0

La mia comprensione dei serializzatori è che suppongono di gestire la serializzazione di dati grezzi in un'istanza di modello e da un'istanza di modello in dati non elaborati (ad esempio JSON). Il fatto che PATCH sia un aggiornamento parziale, puoi avere diverse permutazioni dei dati inviati - non è logico avere un serializzatore diverso per permutazione. –

+0

Cosa intendi per "permutazione"? Gli oggetti non sono ordinati, quindi il loro contenuto non può essere permutato. Ad ogni modo, quello che vuoi qui è aggiungere o rimuovere un campo. Quindi non è lo stesso formato. – spectras

risposta

4

ho bisogno di più spazio di quello commenti forniscono a fare il mio significato chiaro. Quindi ecco cosa suggerisco:

  1. Formattazione diversa significa diversi serializzatori.

    Quindi qui si dispone, ad esempio di MyModelSerializer e di MyModelCreationSerializer. O crearli in modo indipendente o ereditarne uno e specializzarlo (se ha senso).

  2. Utilizzare l'appropriato gancio GenericAPIView per restituire la classe di serializzazione corretta in base a self.action. Un esempio molto semplice potrebbe essere:

    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 
    

    azioni predefinite in viewsets regolari sono documentate here, essi sono:

    • create: metodo POST sulla rotta di base url
    • list: metodo sul percorso di base GET url
    • retrieve: metodo GET su oggetto URL
    • update: metodo PUT su o bject url
    • partial_update: metodo PATCH sull'oggetto url
    • destroy: metodo Delete sull'oggetto url
Problemi correlati