Django ORM深入学习
Django深入进阶
==================https://www.cnblogs.com/yuanchenqi/articles/6083427.html=====================
一、准备工作:表与表结构
class Classes(models.Model):
titile = models.CharField(max_length=32)
teachers = models.ManyToManyField("Teachers")
class Teachers(models.Model):
name = models.CharField(max_length=32)
class Students(models.Model):
username = models.CharField(max_length=32)
age = models.IntegerField()
gender = models.BooleanField()
cs = models.ForeignKey("Classes",on_delete=models.CASCADE)
二、单表操作
###1、单表查询:查询所有信息
def get_classes(request):
classes_list =Classes.objects.all()
return render(request, "get_classes.html", {"classes_list":classes_list})
##2、单表新增:
def add_classes(request):
if request.method =="GET":
return render(request,"add_classes.html")
elif request.method == "POST":
titile = request.POST.get("titile")
Classes.objects.create(titile=titile)
return redirect("/classes.html/")
##3、单表删除
def del_classes(request):
nid = request.GET.get("nid")
Classes.objects.filter(id =nid).delete()
return redirect("/classes.html/")
###单表修改
def edit_classes(request):
if request.method == "GET":
nid = request.GET.get("nid")
obj =Classes.objects.filter(id=nid).first()
print(obj)
return render(request,"edit_classes.html",locals())
elif request.method == "POST":
nid = request.GET.get("nid")
titile = request.POST.get("titile")
Classes.objects.filter(id = nid).update(titile=titile)
return redirect("/classes.html/")
备注:
前段配合的html页面
1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>学生管理系统首页</title> 6 </head> 7 <body> 8 <div>管理系统首页</div> 9 <div> 10 <p> 11 <a href="/students.html/">学生管理界面</a> 12 </p> 13 </div> 14 <div> 15 <p> 16 <a href="/classes.html/">班级管理界面</a> 17 </p> 18 </div> 19 <div> 20 <p> 21 <a href="/classes.html/">老师管理界面</a> 22 </p> 23 </div> 24 </body> 25 </html>
1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>班级查询界面</title> 6 </head> 7 <body> 8 <div> 9 <a href="/add_classes.html/" >添加</a> 10 <a href="/index.html">返回到主页</a> 11 </div> 12 <div> 13 <table border="1"> 14 <thead> 15 <tr> 16 <th>ID</th> 17 <th>名称</th> 18 <th>老师</th> 19 <th>操作</th> 20 </tr> 21 </thead> 22 <tbody> 23 {% for row in classes_list %} 24 <tr> 25 <td>{{ row.id}}</td> 26 <td>{{ row.titile }}</td> 27 <td> 28 {% for item in row.teachers.all %} 29 <span>{{ item.name }}</span> 30 {% endfor %} 31 </td> 32 <td><a href="/del.html/?nid={{ row.id }}">删除</a> 33 | 34 <a href="/edit_classes.html/?nid={{ row.id }}">编辑</a> 35 | 36 <a href="/set_teachers.html/?nid={{ row.id }}">分配老师</a> 37 </td> 38 </tr> 39 {% endfor%} 40 </tbody> 41 </table> 42 </div> 43 </body> 44 </html>
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <form action="/add_classes.html/" method="POST"> {% csrf_token %} <input type="text" name="titile"> <input type="submit" value="提交"> </form> </body> </html>
1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>修改页面</title> 6 </head> 7 <body> 8 <form action="/edit_classes.html/?nid={{ nid }}" method="POST"> 9 {# <input type="text" name ="id" value="{{ obj.id }}" style="display: none">#} 10 <input type="text" name = "titile" value="{{ obj.titile }}"> 11 <input type="submit" value="提交"> 12 </form> 13 14 </body> 15 </html>
二、一对多:多表操作
from django.shortcuts import render,redirect,HttpResponse
from web.models import *
###1、一对多查询
def get_students(request):
stu_list =Students.objects.all()
return render(request,"get_students.html",{"stu_list":stu_list})
###2、1对多新增:外键赋值的时候要写成数据库存储的字段名即:xxx_id
def add_students(request):
if request.method =="GET":
cs_list=Classes.objects.all()
return render(request,"add_students.html",locals())
elif request.method == "POST":
username = request.POST.get("username")
age = request.POST.get("age")
gender = request.POST.get("gender")
cs = request.POST.get("cs")
Students.objects.create(username=username,age=age,gender=gender,cs_id=cs)
return redirect("/students.html/")
###3、一对多删除与单表删除步骤一致,但是我在创建外键关系的时候为:级联删除,
# ##即在删除主键记录时候班级记录的时候会级联删除掉该班级的学生记录
def del_students(request):
nid = request.GET.get("nid")
Students.objects.filter(id=nid).delete()
return redirect("/students.html/")
###一对多修改数据
def edit_students(request):
if request.method=="GET":
nid = request.GET.get("nid")
obj = Students.objects.filter(id=nid).first()
all_cs_list =Classes.objects.values("id","titile")
cs_list = obj.cs_id
print(cs_list)
return render(request,"edit_students.html",locals())
elif request.method =="POST":
nid = request.GET.get("nid")
username = request.POST.get("username")
age = request.POST.get("age")
gender = request.POST.get("gender")
cs = request.POST.get("class_id")
print("这是班级名称:", cs)
###修改的时候外键字段为数据库保存的字段
Students.objects.filter(id = nid ).update(username=username,age = age,gender=gender,cs_id = cs)
return redirect("/students.html/")
备注:
前段配合的html页面
1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>学生查询界面</title> 6 </head> 7 <body> 8 <div> 9 <a href="/add_students.html/" >添加</a> 10 <a href="/index.html">返回到主页</a> 11 </div> 12 <div> 13 <table border="1"> 14 <thead> 15 <tr> 16 <th>ID</th> 17 <th>姓名</th> 18 <th>年龄</th> 19 <th>性别</th> 20 <th>班级</th> 21 <th>操作</th> 22 </tr> 23 </thead> 24 <tbody> 25 {% for row in stu_list %} 26 <tr> 27 <td>{{ row.id}}</td> 28 <td>{{ row.username }}</td> 29 <td>{{ row.age }}</td> 30 <td>{{ row.gender }}</td> 31 <td>{{ row.cs.titile }}</td> 32 33 34 <td><a href="/del_students.html/?nid={{ row.id }}">删除</a> 35 | 36 <a href="/edit_students.html/?nid={{ row.id }}">编辑</a> 37 </td> 38 </tr> 39 {% endfor%} 40 </tbody> 41 </table> 42 </div> 43 </body> 44 </html>
1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>Title</title> 6 </head> 7 <body> 8 <form action="/add_students.html/" method="POST"> 9 {% csrf_token %} 10 <h>请添加用户</h> 11 <p> 12 <input type="text" name="username" placeholder="用户名"> 13 </p> 14 <p> 15 <input type="text" name="age" placeholder="年龄"> 16 </p> 17 <p> 18 男:<input type="radio" name="gender" value="1"> 19 女:<input type="radio" name="gender" value="0"> 20 </p> 21 <p> 22 <select name="cs" > 23 {% for row in cs_list %} 24 <option value={{ row.id }}>{{ row.titile }}</option> 25 {% endfor %} 26 </select> 27 </p> 28 <input type="submit" value="提交"> 29 </form> 30 </body> 31 </html>
1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>修改页面</title> 6 </head> 7 <body> 8 <form action="/edit_students.html/?nid={{ nid }}" method="POST"> 9 {# <input type="text" name ="id" value="{{ obj.id }}" style="display: none">#} 10 <p><input type="text" name="username" value="{{ obj.username }}"></p> 11 <p><input type="text" name="age" value="{{ obj.age }}"></p> 12 <p> 13 {% if obj.gender %} 14 男:<input type="radio" name = "gender" checked="checked" value="1"> 15 女:<input type="radio" name = "gender" value="0"> 16 {% else %} 17 男:<input type="radio" name = "gender" value="1"> 18 女:<input type="radio" name = "gender" checked="checked" value="0"> 19 {% endif %} 20 </p> 21 <p> 22 <select name="class_id" > 23 console.log(name) 24 {% for row in all_cs_list %} 25 {% if row.id == cs_list %} 26 <option value="{{ row.id }}" selected>{{ row.titile }} </option> 27 {% endif %} 28 <option value={{ row.id }} >{{ row.titile }} </option> 29 30 {% endfor %} 31 </select> 32 </p> 33 <p><input type="submit" value="提交"></p> 34 35 36 37 </form> 38 39 </body> 40 </html>
三、一对多:多表操作
def set_teachers(request):
if request.method =="GET":
nid = request.GET.get("nid")
cls_obj = Classes.objects.filter(id = nid).first()
cls_teacher_list = cls_obj.teachers.all().values_list("id","name")
id_list = list(zip(*cls_teacher_list))[0] if list(zip(*cls_teacher_list)) else []
all_teacher_list = Teachers.objects.all()
return render(request,"set_teachers.html", locals())
elif request.method == "POST":
##在地三张表中添加多对多的关系
nid = request.GET.get("nid")
ids = request.POST.getlist("teachers_ids")
print("当前的班级:",nid,"当前的老师:",ids)
Classes.objects.filter(id =nid).first().teachers.set(ids)
return redirect("/classes.html/")
备注:
前段配合的html页面
1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>Title</title> 6 </head> 7 <body> 8 <form action="/set_teachers.html/?nid={{ nid }}" method="POST"> 9 <select multiple size = "10" name="teachers_ids"> 10 {% for item in all_teacher_list %} 11 {% if item.id in id_list %} 12 <option value="{{ item.id }}" selected="selected">{{ item.name }}</option> 13 {% else %} 14 <option value="{{ item.id }}" >{{ item.name }}</option> 15 {% endif %} 16 {% endfor %} 17 </select> 18 <p><input type="submit" value="提交"></p> 19 </form> 20 </body> 21 </html>

浙公网安备 33010602011771号