18.2. Ninja GET

File myproject/schemas.py:

18.2.1. HTTP Schemas

>>> 
... from ninja import Schema
...
...
... class OkResponse(Schema):
...     status: int = 200
...     reason: str = 'Ok'
...     data: str
...
...
... class CreatedResponse(Schema):
...     status: int = 201
...     reason: str = 'Created'
...     data: str
...
...
... class BadRequestResponse(Schema):
...     status: int = 400
...     reason: str = 'Bad request'
...     data: str
...
...
... class NotFoundResponse(Schema):
...     status: int = 404
...     reason: str = 'Not found'
...     data: str
...
...
... class UnauthorizedResponse(Schema):
...     status: int = 401
...     reason: str = 'Unauthorized'
...     data: str

18.2.2. Custom Schemas

File shop/schemas.py:

>>> 
... from ninja import Schema
...
...
... class ProductSchema(Schema):
...     ean13: str
...     name: str
...     price: float
...
...     model_config = {
...         'json_schema_extra': {
...             'example': {
...                 'name': 'My Product',
...                 'ean13': '1234567890123',
...                 'price': 123.45}}}

18.2.3. API Endpoints

File shop/api.py:

>>> 
... from django.http import HttpRequest
... from ninja import Router
... from ninja.pagination import paginate, PageNumberPagination
... from auth.api import SessionID
... from myproject.schemas import BadRequestResponse, NotFoundResponse, OkResponse
... from shop.models import Product
... from shop.schemas import ProductSchema
...
...
... router = Router()
...
...
... @router.get('/products', response=list[ProductSchema])
... @paginate(PageNumberPagination, page_size=5)
... def products_list(request: HttpRequest):
...     products = Product.objects.all().values('name', 'price', 'ean13')
...     return list(products)
...
...
... @router.get('/product', response=ProductSchema)
... def products_list(request: HttpRequest, name: str = None, ean13: str = None) -> dict:
...     if name is not None:
...         product = Product.objects.get(name=name)
...     elif ean13 is not None:
...         product = Product.objects.get(ean13=ean13)
...     else:
...         return {'status': 400, 'reason': 'Bad request'}
...     data = vars(product)
...     data.pop('_state')
...     return data
...
...
... @router.get('/product/{pk}', response={
...     200: ProductSchema,
...     404: NotFoundResponse})
... def product_details(request: HttpRequest, pk: int):
...     try:
...         product = Product.objects.get(pk=pk)
...     except Product.DoesNotExist:
...         return 404, {'data': 'Product not found'}
...     else:
...         data = vars(product)
...         data.pop('_state')
...         return 200, data