全栈开发

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"
}