¿Cómo preferir cuál de los genéricos y el conjunto de vistas usar? en otras palabras, ¿cuándo debo usar genéricos y cuándo debo usar viewset para construir api? Sé que hacen lo mismo, pero viewset tiene enrutadores, entonces, ¿en qué situación los genéricos son mejores que viewset?
Mi regla de oro para esto es usar genéricos siempre que tenga que anular los métodos predeterminados para lograr diferentes especificaciones de las vistas de lista y detalles.
Por ejemplo, cuando tiene diferentes clases de serializador para enumerar sus recursos y para recuperar los detalles de un recurso por id, considero que usar genéricos es una mejor opción, ya que probablemente la lógica de estos dos puntos finales evolucionará por separado. Tenga en cuenta que es una buena práctica mantener diferentes lógicas desacopladas.
Cuando su punto final es muy simple y no necesita personalizar la lógica entre las operaciones de lista/creación y recuperación/actualización/eliminación, puede usar el conjunto de vistas, pero teniendo en cuenta que puede ser bueno separarlo en dos vistas en caso de que estas operaciones La lógica comienza a crecer en diferentes caminos.
Son diferentes, vamos a ver.
DRF tiene dos sistemas principales para manejar vistas:
get
, post
, put
, patch
y delete
.list
: solo lectura, devuelve múltiples recursos (verbo http: get
). Devuelve una lista de dictados.retrieve
: solo lectura, recurso único (verbo http: get
, pero esperará una identificación en la URL). Devuelve un único dict.create
: crea un nuevo recurso (verbo http: post
)update/partial_update
: edita un recurso (verbos http: put/patch
)destroy
: elimina un recurso (verbo http: delete
)Ambos se pueden usar con direcciones URL normales de Django.
Debido a las convenciones establecidas con las acciones , ViewSet
también tiene la capacidad de asignarse a un enrutador , lo que es realmente útil.
Ahora, ambas vistas tienen accesos directos , estos accesos directos le brindan una implementación simple lista para usar.
GenericAPIView : para APIView
, esto le brinda accesos directos que se asignan de cerca a sus modelos de base de datos. Agrega el comportamiento comúnmente requerido para la lista estándar y las vistas detalladas. Le da algunos atributos como serializer_class
, también da pagination_class
, filter_backend
, etc.
GenericViewSet : hay muchos GenericViewSet, el más común es ModelViewSet
. Heredan de GenericAPIView
y tienen una implementación completa de todas las acciones : list
, retrieve
, destroy
, updated
, etc. Por supuesto, también puede elegir algunas de ellas, leer los documentos .
Entonces, para responder a su pregunta: DRY , si está haciendo algo realmente simple, con un ModelViewSet
debería ser suficiente, incluso redefinir y llamar a super
también es suficiente. Para casos más complejos, puede optar por clases de nivel inferior.
¡Espero haberte ayudado!