创建应用
python manage.py startapp employee
在settings.py中配置employee应用:
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'employee.apps.EmployeeConfig',
]
创建模型
修改employee/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)
cv = models.FileField(null=True, blank=True)
编写CRUD接口
修改employee/views.py,编写员工和部门的增删改查相关的接口:
from datetime import date
from typing import List
from ninja import NinjaAPI, Schema
from django.shortcuts import get_object_or_404
from .models import Employee, Department
api = NinjaAPI()
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
# 部门信息接口
@api.post("/departments")
def create_department(request, payload: DepartmentIn):
"""添加部门"""
department = Department.objects.create(**payload.dict())
return {"id": department.id}
@api.get("/departments/{department_id}", response=DepartmentOut)
def get_department(request, department_id: int):
"""根据ID获取部门"""
department = get_object_or_404(Department, id=department_id)
return department
@api.get("/departments", response=List[DepartmentOut])
def list_departments(request):
"""获取所有部门"""
qs = Department.objects.all()
return qs
@api.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}
@api.delete("/departments/{department_id}")
def delete_department(request, department_id: int):
"""删除部门"""
department = get_object_or_404(Department, id=department_id)
department.delete()
return {"success": True}
# 员工信息接口
@api.post("/employees")
def create_employee(request, payload: EmployeeIn):
"""添加员工"""
employee = Employee.objects.create(**payload.dict())
return {"id": employee.id}
@api.get("/employees/{employee_id}", response=EmployeeOut)
def get_employee(request, employee_id: int):
"""根据ID获取员工"""
employee = get_object_or_404(Employee, id=employee_id)
return employee
@api.get("/employees", response=List[EmployeeOut])
def list_employees(request):
"""获取所有员工"""
qs = Employee.objects.all()
return qs
@api.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}
@api.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}
配置路由
修改urls.py,引入employee下的api并分配路由:
from django.contrib import admin
from django.urls import path
from employee.views import api
urlpatterns = [
path("admin/", admin.site.urls),
path("api/", api.urls),
]
迁移模型
python manage.py makemigrations
python manage.py migrate
通过接口文档测试
启动服务,浏览器访问接口文档:http://127.0.0.1:8000/api/docs,分别对部门信息和员工信息的各个接口进行测试。
本文使用 markdown.com.cn 排版