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 toNone
. 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 to200
.response_body
Type | None, optional - Response body type. Defaults toNone
.
If None, uses the default response body of the viewset.path_parameters
Type[BaseModel] | None, optional - Path parameters type.
Defaults toNone
. 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 toNone
.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 toNone
.operation_kwargs
Dict[str, Any] | None, optional - Additional operation
keyword arguments. Defaults toNone
.
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.