Django Ninja 开发简单的员工管理系统API

230 阅读2分钟

创建应用

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):
    """员工信息出参"""
    idint
    title: str


class EmployeeIn(Schema):
    """员工信息入参"""
    first_name: str
    last_name: str
    department_id: int = None
    birthdate: date = None


class EmployeeOut(Schema):
    """员工信息出参"""
    idint
    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 排版