Come preferire quale di generici e viewsetusare? in altre parole quando dovrei usare generics e quando dovrei usare viewset per costruire api. So che fa la stessa cosa, ma il viewset ha dei router, quindi in quale situazione i generici sono meglio del viewset?
risposte:
3 per risposta № 1Penso che ti confonda un po '.
DRF ha due sistemi principali per la gestione delle viste:
- APIView: Fornisce alcuni metodi di gestione per gestire i verbi http:
get
,post
,put
,patch
, edelete
. - ViewSet: Questa è un'astrazione su APIView, che fornisce Azioni come metodi:
list
: sola lettura, restituisce più risorse (verbo http:get
)retrieve
: sola lettura, singola risorsa (verbo http:get
, ma si aspetterà un ID)create
: crea una nuova risorsa (verbo http:post
)update/partial_update
: modifica una risorsa (verbi http:put/patch
)destroy
: rimuove una risorsa (verbo http:delete
)
Entrambi possono essere utilizzati con i normali URL django.
A causa delle convenzioni stabilite con il Azioni, il ViewSet
ha anche la capacità di essere mappato in un router, il che è davvero utile.
Ora, entrambe queste viste hanno scorciatoie, queste scorciatoie offrono una semplice implementazione pronta per essere utilizzata.
GenericAPIView: per APIView
, questo ti dà scorciatoie che mappano strettamente ai tuoi modelli di database. Aggiunge il comportamento comunemente richiesto per elenchi standard e visualizzazioni di dettaglio. Ti fornisce alcuni attributi come, il serializer_class
, dà anche pagination_class
, filter_backend
, eccetera
GenericViewSet: Ci sono molti GenericViewSet, il più comune dei quali ModelViewSet
. Ereditano da GenericAPIView
e avere una piena implementazione di tutti i Azioni: list
, retrieve
, destroy
, updated
, ecc. Ovviamente puoi anche sceglierne alcuni, leggi i documenti.
Quindi, per rispondere alla tua domanda: ASCIUTTO, se stai facendo qualcosa di veramente semplice, con a ModelViewSet
dovrebbe bastare, anche ridefinire e chiamare super
anche è abbastanza. Per casi più complessi, puoi optare per classi di livello inferiore.
Spero di averti aiutato!
1 per risposta № 2
La mia regola d'oro per questo è usare i generici ogni volta che devo sovrascrivere i metodi predefiniti per ottenere specifiche diverse dalle visualizzazioni elenco e dettagli.
Ad esempio, quando hai un serializzatore diversoclassi per elencare le tue risorse e per recuperare i dettagli di una risorsa tramite id Ritengo che l'uso di generics sia un'opzione migliore poiché probabilmente la logica di questi due endpoint si evolverà separatamente. Tieni presente che è una buona pratica mantenere diverse logiche disaccoppiate.
Quando il tuo endpoint è molto semplice e non lo faiÈ necessario personalizzare la logica tra le operazioni di elenco / creazione e recupero / aggiornamento / eliminazione è possibile utilizzare il viewset, ma tenendo presente che potrebbe essere utile separarlo in due visualizzazioni nel caso in cui la logica di queste operazioni inizi a crescere in percorsi diversi.