文章
django-ninja-crud使用demo
依赖安装
pip install django-ninja-crud
demo
# python manage.py startapp department
models.py
from django.db import models
class Department(models.Model):
title = models.CharField(max_length=255, unique=True)
schemas.py
from ninja import Schema
class DepartmentIn(Schema):
title: str
class DepartmentOut(Schema):
id: int
title: str
views.py
from typing import List
from ninja import NinjaAPI
from ninja_crud import views, viewsets
from .models import Department
from .schemas import DepartmentIn, DepartmentOut
api = NinjaAPI()
class DepartmentViewSet(viewsets.APIViewSet):
api = api
model = Department
list_departments = views.ListView(response_body=List[DepartmentOut])
create_department = views.CreateView(request_body=DepartmentIn, response_body=DepartmentOut)
read_department = views.ReadView(response_body=DepartmentOut)
update_department = views.UpdateView(request_body=DepartmentIn, response_body=DepartmentOut)
delete_department = views.DeleteView()
@api.get("/stats/")
def get_department_stats(request):
return {"total": Department.objects.count()}
urls.py
from django.urls import path
from department.api import api
urlpatterns = [
path('admin/', admin.site.urls),
path('api/', api.urls),
]
数据迁移
python manage.py makemigrations
python manage.py migrate
api说明:
- GET / - List all departments with pagination limit/offset.
- POST / - Create a new department.
- GET /{id} - Retrieve a specific department.
- PUT /{id} - Update a specific department.
- DELETE /{id} - Delete a specific department.
- GET /stats/ - Custom endpoint for department statistics
views.py简写
from ninja import NinjaAPI
from ninja_crud import views, viewsets
from examples.models import Department
from examples.schemas import DepartmentIn, DepartmentOut
api = NinjaAPI()
class DepartmentViewSet(viewsets.APIViewSet):
api = api
model = Department
default_request_body = DepartmentIn
default_response_body = DepartmentOut
list_departments = views.ListView()
create_department = views.CreateView()
read_department = views.ReadView()
update_department = views.UpdateView()
delete_department = views.DeleteView()