学生管理系统

urls.py

    url(r'^student_list/$',views.student_list,name="student_list"),
url(r'^delete_student/(?P<sid>\d+)/$',views.delete_student,name="delete_student"),
url(r'^add_student/',views.add_student,name="add_student"),
url(r'^edit_student/(?P<sid>\d+)/$',views.edit_student,name="edit_student"),

urls

视图部分

# 展示学生信息
def student_list(request):
# 查找到所有学生
student_list = models.Student.objects.all()
return render(request,"student_list.html",{"student_list":student_list}) # 删除学生信息
def delete_student(request,sid):
# 从数据库里面取id值为sid的学生对象
models.Student.objects.filter(id=sid).delete()
# 删除成功,跳转到student_list
return redirect(reverse("student_list")) # 添加学生信息
def add_student(request):
if request.method == "POST":
sname = request.POST.get("sname")
cid = request.POST.get("cid") # 取数据库创建
models.Student.objects.filter().create(sname=sname,cid_id = cid)
return redirect(reverse("student_list"))
class_list = models.Class.objects.all()
return render(request,"add_student.html",{"class_list":class_list}) # 编辑学生信息
def edit_student(request,sid):
student_obj = models.Student.objects.get(id=sid) if request.method == "POST":
sname = request.POST.get("sname")
cid = request.POST.get("cid")
# 更新student_obj
student_obj.sname = sname
student_obj.cid_id = cid
student_obj.save()
return redirect(reverse("student_list")) class_list = models.Class.objects.all()
return render(request,"edit_student.html",{"class_list":class_list,"student":student_obj})

前端部分

<!DOCTYPE html>
<html lang="en">
<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>
<h1>添加学生信息</h1>
<form action="{% url 'add_student' %}" method="post">
{% csrf_token %} {# 跨站请求伪造保护 #}
<label for="i1">学生姓名:</label>
<input id="i1" type="text" value="" name="sname">
<label for="i2">所在班级:</label>
<select name="cid" id="i2">
{% for class in class_list %}
<option value="{{ class.id }}">{{ class.cname }}</option>
{% endfor %}
</select> <button type="submit">提交</button>
<button><a href="{% url 'student_list' %}">取消</a></button> </form>
</body>
</html>

add_student

<!DOCTYPE html>
<html lang="en">
<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>
<button><a href="{% url 'add_student' %}/">
添加
</a></button> <table border="1px">
<thead>
<tr>
<th>#</th>
<th>学生ID</th>
<th>学生姓名</th>
<th>所在班级</th>
<th>操作</th> </tr>
</thead>
<tbody>
{% for student in student_list %} <tr>
<td>{{ forloop.counter }}</td>
<td>{{ student.id }}</td>
<td>{{ student.sname }}</td>
<td>{{ student.cid.cname }}</td>
<td>
<button><a href="{% url 'edit_student' student.id %}">
编辑
</a></button>
<button><a href="{% url 'delete_student' student.id %}">
删除
</a></button>
</td>
</tr> {% endfor %}
</tbody>
</table> </body>
</html>

学生页面

<!DOCTYPE html>
<html lang="en">
<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>
<h1>编辑学生信息</h1>
<form action="{% url 'edit_student' student.id %}" method="post">
{% csrf_token %} {# 跨站请求伪造保护 #}
<label for="i1"></label>
<input id="i1" type="text" name="id" value="{{ student.id }}" style="display: none">
<label for="i2">学生姓名</label>
<input id="i2" type="text" name="sname" value="{{ student.sname }}"> <label for="i3">所在班级</label>
<select name="cid" id="i3">
{% for class in class_list %}
{% if student.cid.id == class.id %}
<option selected value="{{ class.id }}">{{ class.cname }}</option>
{% else %}
<option value="{{ class.id }}">{{ class.cname }}</option>
{% endif %} {% endfor %} </select>
<button type="submit">提交</button>
<a href="{% url 'student_list' %}"><button type="submit">取消</button></a>
</form> </body>
</html>

编辑页面

为什么说cid为一个对象

Django把关系包装成一个具有的对象cid

表之间的关系

对应关系:

  类     -->    表

  类的属性  -->    字段

  实例对象  -->    一条数据(数据行)

数据库层面
外键   对应   另外一个表的一条记录
cid_id
ORM层面:
外键   对应   另外一个表的一个对象
student_obj.cid_id ---> 具体的值

基于对象的跨表查询

一对多查询(班级表和学生表)

正向查询

(由学生表查询班级表) 按字段

查询学生的班级信息

>>> student_obj = models.Student.objects.first()
>>> student_obj.cid # /通过model类中的属性查找到对应的外键数据对象
---> <Class: linux4期> >>> student_obj.cid.cname
---> 'linux4期' >>> student_obj.cid_id # 获取实际外键的值
---> 2

反向查询

(有班级表查询学生表) 表名_set

默认是表名_set.all()

如果在外键的字段中加了related_name属性,则按照该属性的来反向查找

>>> class_obj = models.Class.objects.first()  # 获取第一个班级对象
>>> class_obj.student_set.all() # 通过表名_set反向查询出所有的学生 models.Class.objects.first().student_set.all() # 通过表名_set反向查询出所有的学生 --> <QuerySet [<Student: lishi>, <Student: dandan>, <Student: lili>]>

如果设置了related_name="students",反向查询时可直接使用students进行反向查询。

>>>  models.Class.objects.first().students.all()
--><QuerySet [<Student: lishi>, <Student: dandan>, <Student: lili>]>

一对一查询

表结构设计

class Student(models.Model):
id = models.AutoField(primary_key=True)
sname = models.CharField(max_length=20)
cid = models.ForeignKey(to="Class",to_field="id",related_name="students",null=True)
# 表里面:student_obj.cid_id=Class对象.id ; student_obj.cid=Class对象
# related_name="students" 这个参数好处,表明我在class表的时候能够通过“students” 来找student的类
detail = models.OneToOneField("StudentDetail",null=True) def __str__(self):
return self.sname
# class StudentDetail(models.Model):
height = models.PositiveSmallIntegerField()
email = models.EmailField()
memo = models.CharField(max_length=128,null=True)

正向查询

(由学生信息表查询学生详情表) 按字段

>>>  student_obj = models.Student.objects.first()
>>> student_obj.detail.email
--- '11@55.com'

反向查询

(由学生详情表反向查询学生信息表) 按表名

>>>  a = models.StudentDetail.objects.get(id=1)
>>> a.student.sname
---- 'lishi'

总结

所有的反向的查询的表名均为小写,且需要提醒的是在一对一的反向查询中表名不需要跟set,因为它只有一个对象,通过“.表名”得到的是一个models对象,可以直接查询需要的字段。

关于student.cid.cname

ORM版,学生管理系统02的更多相关文章

  1. ORM版学员管理系统

    ORM版学员管理系统 班级表 表结构 class Class(models.Model): id = models.AutoField(primary_key=True) # 主键 cname = m ...

  2. ORM版学员管理系统1

    ORM版学员管理系统 班级表 表结构 class Class(models.Model): id = models.AutoField(primary_key=True) # 主键 cname = m ...

  3. python简易版学生管理系统

    #coding=utf- def showInfo(): print("**************") print(" 学生管理系统") print(&quo ...

  4. ORM版学员管理系统 2

    学生信息管理 展示学生信息 URL部分 url(r'^student_list/', app01_views.student_list, name="student_list"), ...

  5. ORM版学员管理系统2

    学生信息管理 展示学生信息 URL部分 url(r'^student_list/', app01_views.student_list, name="student_list"), ...

  6. ORM版学员管理系统 3

    老师信息管理 思考 三种方式创建多对多外键方式及其优缺点. 通过外键创建 class Class(models.Model): id = models.AutoField(primary_key=Tr ...

  7. ORM版学员管理系统3

    老师信息管理 思考 三种方式创建多对多外键方式及其优缺点. 通过外键创建 class Class(models.Model): id = models.AutoField(primary_key=Tr ...

  8. Django之ORM版学员管理系统

    班级表 表结构 class Class(models.Model): id = models.AutoField(primary_key=True) # 主键 cname = models.CharF ...

  9. Java 简化版学生管理系统(IO版)

    Student management system   学生管理系统IO版 详细知识点可参考一下几篇文章 常用API Java 之ArrayList集合及应用 Java 之IO流及应用 Compreh ...

随机推荐

  1. js验证真实姓名

    var regName = /^[\u4e00-\u9fa5]{2,4}$/; if (!regName.test(examinee.name)) { wx.showToast({ title: &q ...

  2. DB 数据同步到数据仓库的架构与实践

    背景 在数据仓库建模中,未经任何加工处理的原始业务层数据,我们称之为ODS(Operational Data Store)数据.在互联网企业中,常见的ODS数据有业务日志数据(Log)和业务DB数据( ...

  3. Flume1.7.0的安装与使用

    Flume下载后,解压,新增一个配置文件,写入配置即可 我将配置文件写在 conf 下,取名为 flume-conf-spooldir.properties Flume 运行命令: bin/flume ...

  4. IDEA MAVEN Project 显示问题

    今天正常打开idea,却发现maven窗口找不到了:试了这些方法 首先idea自带了maven控件,不像Eclipse还需要下载控件,如果你以前有maven在右边,出于某种原因,消失找不到 了,你可以 ...

  5. python中命令行参数

    python中的命令行参数 python中有一个模块sys,sys.argv这个属性提供了对命令行参数的访问.命令行参数是调用某个程序时除程序名外的其他参数. sys.argv是命令行参数的列表 le ...

  6. CSS流体(自适应)布局下宽度分离原则

    CSS流体(自适应)布局下宽度分离原则 这篇文章发布于 2011年02月28日,星期一,00:48,归类于 css相关. 阅读 73990 次, 今日 5 次 by zhangxinxu from h ...

  7. 如何用纯 CSS 创作一个小球上台阶的动画

    效果预览 在线演示 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/PBGJwL 可交互视频 ...

  8. Oracle数据类型(4)

    字符类型: CHAR(size):固定长度字符串,最大长度2000 bytes VARCHAR2(size):可变长度的字符串,最大长度4000 bytes,可做索引的最大长度749 NCHAR(si ...

  9. ReactNative之Android打包APK方法(趟坑过程)

    欢迎大家加群讨论 点击链接加入群[ReactNative-解决问题交流群] :644124441 点击链接加入群[ReactNative技术交流群2] :687663534 多余的不解释了.直接上车吧 ...

  10. SQLite教程

    SQLite教程 http://www.runoob.com/sqlite/sqlite-date-time.html SQLite管理工具http://www.sqliteexpert.com/do ...