Insight into the workings of the ReadView in Django Ninja CRUD

ReadView

class ReadView(APIView)

Declarative class-based view for reading a model instance in Django Ninja.

This class provides a standard implementation for a read view, which retrieves
a single model instance based on the path parameters. It is intended to be used
in viewsets or as standalone views to simplify the creation of read endpoints.

Arguments:

  • name str | None, optional - View function name. Defaults to None. If None,
    uses class attribute name in viewsets or "handler" for standalone views.
  • methods List[str], optional - HTTP methods. Defaults to ["GET"].
  • path str, optional - URL path. Defaults to "/{id}".
  • response_status int, optional - HTTP response status code. Defaults to 200.
  • response_body Type | None, optional - Response body type. Defaults to None.
    If None, uses the default response body of the viewset.
  • path_parameters Type[BaseModel] | None, optional - Path parameters type.
    Defaults to None. If not provided, resolved from the path and model.
  • model Type[django.db.models.Model] | None, optional - Associated Django model.
    Inherits from viewset if not provided. Defaults to None.
  • get_model Callable | None, optional - Retrieves model instance. Default uses
    path parameters (e.g., self.model.objects.get(id=path_parameters.id)
    for /{id} path). Useful for customizing model retrieval logic.
    Should have the signature:
    • (request: HttpRequest, path_parameters: Optional[BaseModel]) -> Model
  • decorators List[Callable] | None, optional - View function decorators
    (applied in reverse order). Defaults to None.
  • operation_kwargs Dict[str, Any] | None, optional - Additional operation
    keyword arguments. Defaults to None.

Example:

from ninja import NinjaAPI
from ninja_crud import views, viewsets

from examples.models import Department
from examples.schemas import DepartmentOut

api = NinjaAPI()

# Usage as a class attribute in a viewset:
class DepartmentViewSet(viewsets.APIViewSet):
    api = api
    model = Department
    default_response_body = DepartmentOut

    # Usage with default response body:
    read_department = views.ReadView()

    # Usage with explicit response body:
    read_department = views.ReadView(response_body=DepartmentOut)

# Usage as a standalone view:
views.ReadView(
    name="read_department",
    model=Department,
    response_body=DepartmentOut,
).add_view_to(api)

set_api_viewset_class

def set_api_viewset_class(api_viewset_class: Type["APIViewSet"]) -> None

Bind the view to a viewset class.

This method sets the model and path parameters type based on the viewset class,
and assigns the response body from the viewset class's default_response_body
if the response body is not already set.

Notes:

This method is called internally and automatically by the viewset when
defining views as class attributes. It should not be called manually.