文章
django-ninja使用demo
一、创建django项目
mkdir learn_django_ninja
cd learn_django_ninja
# 在当前文件夹下创建core项目
django-admin startproject core .
# 创建app
python manage.py startapp hello_world
python manage.py startapp emp
# 添加两个应用到settings.py文件
INSTALLED_APPS = [
...
'emp',
"hello_world"
]
# 执行数据迁移
python manage.py migrate
二、添加api.py
添加:core/api.py
from ninja import NinjaAPI
api = NinjaAPI(
title="My Project API",
version="1.0.0",
description="A fantastic API built with Django Ninja"
)
添加:hello_world/api.py
from ninja import Router
router = Router()
@router.get("hello")
def hello_world(request):
return {"hello": "world"}
编辑:emp/models.py
from django.db import models
class Department(models.Model):
title = models.CharField(max_length=100)
class Employee(models.Model):
first_name = models.CharField(max_length=100)
last_name = models.CharField(max_length=100)
department = models.ForeignKey(Department, on_delete=models.CASCADE)
birthdate = models.DateField(null=True, blank=True)
添加:emp/api.py
from datetime import date
from typing import List
from ninja import Router, Schema
from django.shortcuts import get_object_or_404
from .models import Employee, Department
router = Router(tags=["emp"])
class DepartmentIn(Schema):
title: str
class DepartmentOut(Schema):
id: int
title: str
class EmployeeIn(Schema):
first_name: str
last_name: str
department_id: int = None
birthdate: date = None
class EmployeeOut(Schema):
id: int
first_name: str
last_name: str
department_id: int = None
birthdate: date | None = None
@router.post("/departments")
def create_department(request, payload: DepartmentIn):
department = Department.objects.create(**payload.dict())
return {"id": department.id}
@router.get("/departments/{department_id}", response=DepartmentOut)
def get_department(request, department_id: int):
department = get_object_or_404(Department, id=department_id)
return department
@router.get("/departments", response=List[DepartmentOut])
def list_departments(request):
qs = Department.objects.all()
return qs
@router.put("/departments/{department_id}")
def update_department(request, department_id: int, payload: DepartmentIn):
department = get_object_or_404(Department, id=department_id)
for attr, value in payload.dict().items():
setattr(department, attr, value)
department.save()
return {"success": True}
@router.delete("/department/{department_id}")
def delete_department(request, department_id: int):
department = get_object_or_404(Department, id=department_id)
department.delete()
return {"success": True}
@router.post("/employees")
def create_employee(request, payload: EmployeeIn):
employee = Employee.objects.create(**payload.dict())
return {"id": employee.id}
@router.get("/employees/{employee_id}", response=EmployeeOut)
def get_employee(request, employee_id: int):
employee = get_object_or_404(Employee, id=employee_id)
return employee
@router.get("/employees", response=List[EmployeeOut])
def list_employees(request):
qs = Employee.objects.all()
return qs
@router.put("/employees/{employee_id}")
def update_employee(request, employee_id: int, payload: EmployeeIn):
employee = get_object_or_404(Employee, id=employee_id)
for attr, value in payload.dict().items():
setattr(employee, attr, value)
employee.save()
return {"success": True}
@router.delete("/employees/{employee_id}")
def delete_employee(request, employee_id: int):
employee = get_object_or_404(Employee, id=employee_id)
employee.delete()
return {"success": True}
迁移模型
python manage.py makemigrations
python manage.py migrate
编辑根api.py
from ninja import NinjaAPI
from emp.api import router as emp_router
from hello_world.api import router as hello_router
api = NinjaAPI(
title="My Project API",
version="1.0.0",
description="A fantastic API built with Django Ninja"
)
api.add_router("emp/", emp_router)
api.add_router("hello/", hello_router)
根urls.py
from django.contrib import admin
from django.urls import path
from .api import api
urlpatterns = [
path('admin/', admin.site.urls),
path("api/", api.urls)
]
启动django项目
三:测试api
# 访问
url: http://localhost:8000/api/hello/hello
# 创建部门
url: http://localhost:8000/api/emp/departments
请求类型: post
body使用json格式:
{
"title": "dp01"
}
url: http://localhost:8000/api/emp/employees
请求类型: post
body使用json格式:
{
"first_name": "tom",
"last_name": "t",
"department_id": 1,
"birthdate": "2001-01-01"
}