ORM版学员管理系统 3
老师信息管理
思考
三种方式创建多对多外键方式及其优缺点。
通过外键创建
class Class(models.Model):
id = models.AutoField(primary_key=True) # 主键
cname = models.CharField(max_length=32) # 班级名称
first_day = models.DateField() # 开班时间 class Teacher(models.Model):
tname = models.CharField(max_length=32) # 自定义第三张表,通过外键关联上面两张表
class Teacher2Class(models.Model):
teacher = models.ForeignKey(to="Teacher")
the_class = models.ForeignKey(to="Class") class Meta:
unique_together = ("teacher", "the_class")
通过ManyToManyField创建
class Class(models.Model):
id = models.AutoField(primary_key=True) # 主键
cname = models.CharField(max_length=32) # 班级名称
first_day = models.DateField() # 开班时间 class Teacher(models.Model):
tname = models.CharField(max_length=32)
# 通过ManyToManyField自动创建第三张表
cid = models.ManyToManyField(to="Class", related_name="teachers")
通过外键和ManyToManyField创建
class Class(models.Model):
id = models.AutoField(primary_key=True) # 主键
cname = models.CharField(max_length=32) # 班级名称
first_day = models.DateField() # 开班时间 class Teacher(models.Model):
tname = models.CharField(max_length=32)
# 通过ManyToManyField和手动创建第三张表
cid = models.ManyToManyField(to="Class", through="Teacher2Class", through_fields=("teacher", "the_class")) class Teacher2Class(models.Model):
teacher = models.ForeignKey(to="Teacher")
the_class = models.ForeignKey(to="Class") class Meta:
unique_together = ("teacher", "the_class")
表结构设计
class Teacher(models.Model):
tname = models.CharField(max_length=32)
cid = models.ManyToManyField(to="Class", related_name="teachers")
老师信息列表
URL部分
url(r'^teacher_list/$', app01_views.teacher_list, name="teacher_list"),
视图部分
def teacher_list(request):
teacher_list = models.Teacher.objects.all()
return render(request, "teacher_list.html", {"teacher_list": teacher_list})
前端部分
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta http-equiv="x-ua-compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>老师信息页面</title>
</head>
<body>
<a href="{% url 'add_teacher' %}">添加新老师</a>
<table border="1">
<thead>
<tr>
<th>#</th>
<th>id</th>
<th>老师姓名</th>
<th>授课班级</th>
<th>操作</th>
</tr>
</thead>
<tbody>
{% for teacher in teacher_list %}
<tr>
<td>{{ forloop.counter }}</td>
<td>{{ teacher.id }}</td>
<td>{{ teacher.tname }}</td>
<td>
{% for class in teacher.cid.all %}
{% if forloop.last %}
{{ class.cname }}
{% else %}
{{ class.cname }},
{% endif %}
{% endfor %}
</td>
<td>
<a href="{% url 'delete_teacher' teacher.id %}">删除</a>
<a href="{% url 'edit_teacher' teacher.id %}">编辑</a>
</td>
</tr>
{% endfor %}
</tbody>
</table>
</body>
</html>
删除老师信息
URL部分
url(r'^delete_teacher/(?P<tid>\d+)$', app01_views.delete_teacher, name="delete_teacher"),
视图部分
def delete_teacher(request, tid):
models.Teacher.objects.filter(id=tid).delete()
return redirect(reverse("teacher_list"))
前端部分
在老师列表页面添加一个删除的链接。
<a href="{% url 'delete_teacher' teacher.id %}">删除</a>
添加老师信息
URL部分
url(r'^add_teacher/$', app01_views.add_teacher, name="add_teacher"),
视图部分
def add_teacher(request):
if request.method == "POST":
tname = request.POST.get("tname")
class_ids = request.POST.getlist("class_id")
new_teacher = models.Teacher.objects.create(tname=tname)
# 查询出所有被选中的班级信息
class_objs = models.Class.objects.filter(id__in=class_ids)
# 将老师的授课班级设置为选中的班级, 以下四种都可以,注意什么时候加*
new_teacher.cid.set(class_objs)
# new_teacher.cid.add(*class_objs)
# new_teacher.cid.add(*class_ids)
# new_teacher.cid.set(class_ids)
new_teacher.save()
return redirect(reverse("teacher_list")) class_list = models.Class.objects.all()
return render(request, "add_teacher.html", {"class_list": class_list})
前端部分
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta http-equiv="x-ua-compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>添加老师</title>
</head>
<body>
<form action="{% url 'add_teacher' %}" method="post">
{% csrf_token %}
<p>老师姓名:<input type="text" name="tname"></p>
<label for="class_id">授课班级:</label>
<select name="class_id" id="class_id" multiple>
{% for class in class_list %}
<option value="{{ class.id }}">{{ class.cname }}</option>
{% endfor %}
</select>
<p><input type="submit" value="提交"></p>
</form>
</body>
</html>
编辑老师信息
URL部分
url(r'^edit_teacher/(?P<tid>\d+)$', app01_views.edit_teacher, name="edit_teacher"),
视图部分
def edit_teacher(request, tid):
teacher_obj = models.Teacher.objects.get(id=tid)
class_list = models.Class.objects.all() if request.method == "POST":
tname = request.POST.get("tname")
class_ids = request.POST.getlist("class_id")
# 更新老师相关信息
teacher_obj.tname = tname
teacher_obj.cid.set(class_ids)
teacher_obj.save() # 一定记得更新完要保存
return redirect(reverse("teacher_list")) return render(request, "edit_teacher.html", {"class_list": class_list, "teacher": teacher_obj})
前端部分
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta http-equiv="x-ua-compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>编辑老师信息</title>
</head>
<body>
<form action="{% url 'edit_teacher' teacher.id %}" method="post">
{% csrf_token %}
<p>老师姓名:<input type="text" name="tname" value="{{ teacher.tname }}"></p>
<label for="class_id">授课班级:</label>
<select name="class_id" id="class_id" multiple>
{% for class in class_list %}
{% if class in teacher.cid.all %}
<option value="{{ class.id }}" selected>{{ class.cname }}</option>
{% else %}
<option value="{{ class.id }}">{{ class.cname }}</option>
{% endif %}
{% endfor %}
</select>
<p><input type="submit" value="提交"></p>
</form>
</body>
</html>
多对多操作
正向查询(由老师表查询班级表)
>>> teacher_obj = models.Teacher.objects.first()
>>> teacher_obj.cid.all() # 查询该老师授课的所有班级
<QuerySet [<Class: Class object>, <Class: Class object>]>
反向查询(由班级表反向查询老师表)
>>> class_obj = models.Class.objects.first()
>>> class_obj.teachers.all() # 此处用到的是related_name,如果不设置的话就用默认的表名_set
<QuerySet [<Teacher: Teacher object>, <Teacher: Teacher object>, <Teacher: Teacher object>]>
ORM版学员管理系统 3的更多相关文章
- ORM版学员管理系统
ORM版学员管理系统 班级表 表结构 class Class(models.Model): id = models.AutoField(primary_key=True) # 主键 cname = m ...
- ORM版学员管理系统1
ORM版学员管理系统 班级表 表结构 class Class(models.Model): id = models.AutoField(primary_key=True) # 主键 cname = m ...
- ORM版学员管理系统 2
学生信息管理 展示学生信息 URL部分 url(r'^student_list/', app01_views.student_list, name="student_list"), ...
- ORM版学员管理系统3
老师信息管理 思考 三种方式创建多对多外键方式及其优缺点. 通过外键创建 class Class(models.Model): id = models.AutoField(primary_key=Tr ...
- ORM版学员管理系统2
学生信息管理 展示学生信息 URL部分 url(r'^student_list/', app01_views.student_list, name="student_list"), ...
- Django之ORM版学员管理系统
班级表 表结构 class Class(models.Model): id = models.AutoField(primary_key=True) # 主键 cname = models.CharF ...
- 老男孩Day13作业:ORM学员管理系统
一.作业需求: 用户角色,讲师\学员, 用户登陆后根据角色不同,能做的事情不同,分别如下 讲师视图: 管理班级,可创建班级,根据学员qq号把学员加入班级 可创建指定班级的上课纪录,注意一节上 ...
- 【学员管理系统】0x03 老师信息管理功能
[学员管理系统]0x03 老师信息管理功能 老师信息管理相比于学生信息管理又多了一点,因为我们的数据结构中老师表和班级表是通过teacher2class表进行多对多关联的. 写在前面 项目详细需求参见 ...
- Python开发程序:学员管理系统(mysql)
主题:学员管理系统 需求: 用户角色,讲师\学员, 用户登陆后根据角色不同,能做的事情不同,分别如下 讲师视图: 管理班级,可创建班级,根据学员qq号把学员加入班级 可创建指定班级的上课纪录,注意一节 ...
随机推荐
- 学习笔记DL005:线性相关、生成子空间,范数,特殊类型矩阵、向量
线性相关.生成子空间. 逆矩阵A⁽-1⁾存在,Ax=b 每个向量b恰好存在一个解.方程组,向量b某些值,可能不存在解,或者存在无限多个解.x.y是方程组的解,z=αx+(1-α),α取任意实数. A列 ...
- ssh_exchange_identification: read: Connection reset by peer
vim /etc/hosts.deny 删除ip 借鉴:https://www.sunnyos.com/article-show-81.html
- 密码疑云 (3)——详解RSA的加密与解密
上一篇文章介绍了RSA涉及的数学知识,本章将应用这些知识详解RSA的加密与解密. RSA算法的密钥生成过程 密钥的生成是RSA算法的核心,它的密钥对生成过程如下: 1. 选择两个不相等的大素数p和q, ...
- Linux atop监控说明
2017-02-22 09:42 by pursuer.chen, 7060 阅读, 2 评论, 收藏, 编辑 介绍 atop是一个功能非常强大的linux服务器监控工具,它的数据采集主要包括:CPU ...
- source-insight 常用操作
[Ctrl + ] 跳转到函数.宏.变量 等定义处. [Alt > ] 跳转到最近光标停留位置. [Alt < ] 跳转到上次近光标停留位置. [Ctrl Shift [ ] 块位置开 ...
- pyhanlp:hanlp的python接口
HanLP的Python接口,支持自动下载与升级HanLP,兼容py2.py3. 安装 pip install pyhanlp 使用命令hanlp来验证安装,如因网络等原因自动安装失败,可参考手动配置 ...
- Android环境下hanlp汉字转拼音功能的使用介绍
由于项目需要在Android手机设备上实现汉字转拼音功能(支持多音字),于是首先想到了Pinyin4j+多音字映射对照表的实现方案,并在项目中试用了一段时间,发现数据量大时,其耗时非常严重.后来寻找其 ...
- C语言字符串定义(数组&指针)
/***************************************************************************** * @brief : 字符串定义方法总结 ...
- 实验楼Python破解验证码
本人大二,因为Python结业考试项目,又想要学习机器学习方向,但是由于接触时间不长,选择了实验楼的Python破解验证码这个项目作为我的项目, 我在原来的基础上加了一些代码用于完善,并且对功能如何实 ...
- 总结,为什么要重写hashset的hashcode()和equals()?
看了非常多博客,怕自己忘记了,通俗易懂的总结如下 本人总结下: 重写前,比较地址,hashcode方法如果相等可能是同一个对象,所以再用equals再比内存地址 重写后,比较值,重写hashCode方 ...