/ / generics vs viewset in django rest framework, come preferire quale usare? - django, django-rest-framework

Generics vs viewset in django rest framework, come preferire quale usare? - django, django-rest-framework

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 № 1

Penso che ti confonda un po '.

DRF ha due sistemi principali per la gestione delle viste:

  1. APIView: Fornisce alcuni metodi di gestione per gestire i verbi http: get, post, put, patch, e delete.
  2. 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.