创建Django项目
#第一步确保自己的pip拥有这个几包(django-cors-headers、mysqlclient、serializers、djangorestframework)pip list
#本次项目名称为Django,应用名称为app
创建项目:django-admin startproject Django(项目名称)
进入目录:cd Django
创建应用:python manage.py startapp app(子应用名称)
Django/setting配置(部分配置,不可直接复制!!!)
INSTALLED_APPS = [
'app',
'corsheaders'
]
# 'django.middleware.csrf.CsrfViewMiddleware',如果你的项目没有考虑到 csrf 网络攻击,可注释掉,否则会报错没有传递 csrf cookie
MIDDLEWARE = [
'corsheaders.middleware.CorsMiddleware',
]
CORS_ORIGIN_ALLOW_ALL = True
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': '数据库',
'USER': '用户',
'PASSWORD': '密码',
'HOST': '主机地址',
'PORT': '端口号',
}
}
app/models.py(数据库文件)
from django.db import models
# 创建你的数据库结构
# 一对一结构-一对多结构-多对多结构
class Student(models.Model):
name = models.CharField(max_length=100, null=True, blank=True) # 姓名
sex = models.IntegerField(choices=[(0, '男'), (1, '女')], null=True, blank=True) # 性别,0表示男,1表示女
age = models.IntegerField(null=True, blank=True) # 年龄
courses = models.ManyToManyField('Course', related_name='students', blank=True) # 课程多对多关联
classroom = models.ForeignKey('Classroom', on_delete=models.CASCADE, null=True, blank=True) # 班级外键
detail = models.OneToOneField('StudentDetail', on_delete=models.CASCADE, null=True, blank=True) # 学生详细信息一对一关联
class Meta:
db_table = 'Student'
class Course(models.Model):
course_name = models.CharField(max_length=100, null=True, blank=True) # 课程名称
class Meta:
db_table = 'Course'
class Classroom(models.Model):
class_name = models.CharField(max_length=100, null=True, blank=True) # 班级名称
class Meta:
db_table = 'Classroom'
class StudentDetail(models.Model):
introduction = models.TextField(null=True, blank=True) # 自我介绍字段
class Meta:
db_table = 'StudentDetail'
# 级联查询
class City(models.Model):
city_name = models.CharField(max_length=100, null=True, blank=True) # 城市名称
level = models.IntegerField(choices=(
(0, '省'),
(1, '市'),
(2, '区,县'),
(3, '村'),
), null=True, blank=True) # 等级,0表示省,1表示市,2表示县
parent_id = models.IntegerField(null=True, blank=True) # 上级城市ID
class Meta:
db_table = 'City'
# 生成迁移文件!!!
# python manage.py makemigrations app
# 根据迁移文件生成数据库文件
# python manage.py migrate
app/serializers.py(数据库序列化文件,手动创建)
from rest_framework import serializers
from .models import *
# 一对一结构-一对多结构-多对多结构
class CourseSerializer(serializers.ModelSerializer):
class Meta:
model = Course
fields = "__all__"
class ClassroomSerializer(serializers.ModelSerializer):
class Meta:
model = Classroom
fields = "__all__"
class StudentDetailSerializer(serializers.ModelSerializer):
class Meta:
model = StudentDetail
fields = "__all__"
class StudentSerializer(serializers.ModelSerializer):
classroom = ClassroomSerializer() # 使用嵌套的 CitySerializer
detail = StudentDetailSerializer() # 关联信息
courses = CourseSerializer(many=True)
class Meta:
model = Student
fields = "__all__"
# 级联查询
class CitySerializer(serializers.ModelSerializer):
children = serializers.SerializerMethodField()
class Meta:
model = City
fields = "__all__"
def get_children(self, obj):
children = City.objects.filter(parent_id=obj.id)
print(children)
serializer = CitySerializer(children, many=True)
return serializer.data
Django/urls.py配置(配置路由分支管理,base可随意更换,http://127.0.0.1:8000/base)
from django.urls import path, include
urlpatterns = [
path('base/',include('app.urls')),
]
app/urls.py配置(需手动创建!!配置子路由管理,index可随意更换,http://127.0.0.1:8000/base/index)
from django.urls import path
from .views import *
urlpatterns = [
path('index/',IndexView.as_view()),
]
app/views.py配置(路由内容管理中心)
from rest_framework.views import APIView
from django.http import JsonResponse
class IndexView(APIView):
def get(self, request):
return JsonResponse({
'code': 1,
})
基础配置结束(启动!!!)
python manage.py runserver
# http://localhost:8000/base/index/
操作类
app/views.py
from django.db.models import Q
from rest_framework.views import APIView
from django.http import JsonResponse
from django.core.paginator import Paginator
from .serializers import *
from .models import *
import json
class IndexView(APIView):
def get(self, request):
data = request.data # 示例类型,也可以一个值都不传 {"page_current":1,"page_size":5,"sort":["age","id"],"filter":{"id":2,"name__regex":"娃"}}
q = Q() # q.connector = 'AND' 连接规则,默认为AND,也可以为OR
if data.get('filter'):
for key, value in json.loads(data.get('filter')).items():
q.children.append((key, value))
student_all = Student.objects.filter(q)
if data.get('sort'):
student_all = student_all.order_by(*json.loads(data.get('sort')))
student_paginator = Paginator(student_all, data.get('page_size', 5))
student_page = student_paginator.get_page(data.get('page_current', 1))
return JsonResponse({
'code': 1,
'student': StudentSerializer(student_page, many=True).data,
'pages': {
'page_num': student_paginator.num_pages,
'student_count': student_paginator.count,
},
'city': CitySerializer(City.objects.filter(level=0), many=True).data,
})
def put(self, request):
data = request.data # 将请求体解码为字符串
# # 添加一条学生信息
# student = Student(name=data.get('name'), sex=data.get('sex'), age=data.get('age'),classroom_id=data.get('classroom_id'), detail_id=data.get('detail_id'))
# student.save()
# # 清空学生的课程列表()添加信息可以跳过这一步,修改信息需要这一步,
# student.courses.clear()
# # 设置新的课程列表,数组类型,数组内是一个数组类型id,例如<[1,3]>json.loads(data.get('course_ids'))
# student.courses.set(json.loads(data.get('course_ids')))
return JsonResponse({
'code': 1,
'msg': '添加成功',
})