web后端--Django学习笔记04
一:“一对多”模型关系
在“多”方模型类创建外键类属性,关联“一”方。
class School(models.Model): # "一"方模型 pass
class Student(models.Model): # "多"方模型 stuschool = models.ForeignKey(School,on_delete=models.CASCADE)
1.创建“一”方模型对象
school1 = School.objects.create(name="清华大学",address="北京",establish_date=date(1901,4,10))
2.创建“多”方模型对象
方式一:通过“一”方的实例化对象关联stu1 = Student.objects.create(name="张清华",sex='男',score=83.5,stuschool=school1)
方式二:通过对应表的外键关联stu2 = Student.objects.create(name="李清华",sex="女",score=89,stuschool_id=1)
方式三:通过“一”方添加对象stu3 = school1.student_set.create(name="赵清华",sex='女',score=93)
3.从“一”方查询“多”方
使用“多”方模型类小写_set,作为“一”方容器。students = school1.student_set.all()
4.从“多”方查询“一”方
使用“多”方外键属性直接获取对应的“一”方实例school = stu1.stuschool
5.代码演示
1、models
from django.db import models class School(models.Model):name = models.CharField(max_length=20)address = models.CharField(max_length=30)establish_date = models.DateField() def __str__(self):return self.name class Meta:db_table = 'schools'ordering = ('establish_date',) class Student(models.Model):name = models.CharField(max_length=20)sex = models.CharField(max_length=10)score = models.FloatField()stuschool = models.ForeignKey(School,on_delete=models.CASCADE) def __str__(self):return self.name class Meta:db_table = 'students'ordering = ('-score','-id')
2、Terminal
C:\python\DjangoDay41>python manage.py startapp one2ma ngapp C:\python\DjangoDay41>python manage.py makemigrations Migrations for 'one2mangapp':one2mangapp\migrations\0001_initial.py- Create model School- Create model Student C:\python\DjangoDay41>python manage.py migrate Operations to perform:Apply all migrations: admin, auth, contenttypes, hom ework, one2mangapp, sessions Running migrations:Applying one2mangapp.0001_initial... OK C:\python\DjangoDay41>python manage.py shell Python 3.7.0 (v3.7.0:1bf9cc5093, Jun 27 2018, 04:59:51 ) [MSC v.1914 64 bit (AMD64)] on win32 Type "help", "copyright", "credits" or "license" for m ore information. (InteractiveConsole) >>> from one2mangapp.models import * >>> from datetime import date >>> school1 = School.objects.create(name="清华大学",address="北京",establish_date=date(1901,4,10)) >>> stu1 = Student.objects.create(name="张清华",sex='男',score=83.5,stuschool=school1) >>> stu2 = Student.objects.create(name="李清华",sex="女",score=89,stuschool_id=1) >>> stu3 = school1.student_set.create(name="赵清华",sex='女 ',score=93) >>> stu4 = school1.student_set.create(name="王清华",sex='女 ',score=85) >>> school2 = School.objects.create(name="北京大学",address ="北京",establish_date=date(1903,3,15)) >>> schools = School.objects.all() >>> for s in schools: ... print(s) ... 清华大学 北京大学 >>> students = Student.objects.all() >>> for s in students: ... print(s) ... 赵清华 李清华 王清华 张清华 >>> schools = School.objects.all() >>> for s in schools: ... print(s) ... 清华大学 北京大学 >>> students = Student.objects.all() >>> for s in schools: ... print(s) ... 清华大学 北京大学 >>> for s in students: ... print(s) ... 赵清华 李清华 王清华 张清华 >>> school1 = School.objects.get(id=1) >>> school1 <School: 清华大学> >>> students = school1.student_set.all() >>> for s in students: ... print(s) ... 赵清华 李清华 王清华 张清华 >>> school2 = Student.objects.get(id=2) >>> school2 <Student: 李清华> >>> school2 = School.objects.get(id=2) >>> school2 <School: 北京大学> >>> Student.objects.create(name='刘备大',sex='男',score=88, stuschool=school2) <Student: 刘备大> >>> Student.objects.create(name='王备大',sex='男',score=88, stuschool=school2) <Student: 王备大> >>> students = school2.student_set.all() >>> for s in students: ... print(s) ... 王备大 刘备大 >>> stu1 = Student.objects.get(id=5) >>> stu1 <Student: 刘备大> >>> stu1.stuschool <School: 北京大学>
二:“一对一”模型关系
在维护关系的“一方”使用models.OneToOneField(“另一个一方模型类名称”,on_delete=models.CASCADE) class Person(models.Model): pass
class IDCard(models.Model): cardno = models.CharField(max_length=20,primary_key=True) per = models.OneToOneField(Person,on_delete=models.CASCADE) # 一对一关联
1.创建不负责维护关系的“一方”
per1 = Person.objects.create(name="张三",age=20,ismarried=False)
2.创建负责维护关系的“一方”
方式一:通过另一方的实例化对象关联card1 = IDCard.objects.create(cardno='zs123456',per=per1)
方式二:通过表中的唯一外键关联card2 = IDCard.objects.create(cardno='ls123456',per_id=2)
3.从“主动一方”查询“被动一方”
通过“被动一方”模型类名的小写形式card1 = per1.idcard
4.从“被动一方”查询“主动一方”
通过“被动一方”的维护关系的类属性直接查询到“主动一方”per1 = card1.per
5.删除记录
per = Person.objects.get(id=2) # 查询2号记录per.delete() # 删除2号记录(级联删除)
6.代码演示
1、models
from django.db import models class Person(models.Model):name = models.CharField(max_length=10)age = models.IntegerField()ismarried = models.BooleanField() def __str__(self):return self.name class Meta:db_table = 'person' class IDCard(models.Model):cardno = models.CharField(max_length=20,primary_key=True)per = models.OneToOneField(Person,on_delete=models.CASCADE) # 一对一关联 def __str__(self):return self.cardno class Meta:db_table = 'cards'
2、Terminal
C:\python\DjangoDay41>python manage.py startapp one2oneapp C:\python\DjangoDay41>python manage.py makemigrations Migrations for 'one2oneapp':one2oneapp\migrations\0001_initial.py- Create model IDCard- Create model Person- Add field per to idcard C:\python\DjangoDay41>python manage.py migrate Operations to perform:Apply all migrations: admin, auth, contenttypes, homework , one2mangapp, one2oneapp, sessions Running migrations:Applying one2oneapp.0001_initial... OK C:\python\DjangoDay41>python manage.py shell Python 3.7.0 (v3.7.0:1bf9cc5093, Jun 27 2018, 04:59:51) [MS C v.1914 64 bit (AMD64)] on win32 Type "help", "copyright", "credits" or "license" for more i nformation. (InteractiveConsole) >>> from one2oneapp.models import * >>> per1 = Person.objects.create(name="张三",age=20,ismarri ed=False) >>> per1 = Person.objects.create(name="李娟",age=20,ismarri ed=True)
三:“多对多”关系
在某个“多方”通过 models.ManyToManyField(另一个多方模型类,through="中间关系模型类") 设置模型之间的关系。
在中间模型类中至少有两个外键类属性,分别关联两个多方模型。
class Student(models.Model): pass
class Course(models.Model): name = models.CharField(max_length=10) stu = models.ManyToManyField(Student,through="Student_Course") # 多对多关系
class Student_Course(models.Model): # 中间模型,负责维护两个“多方”模型 student = models.ForeignKey(Student,on_delete=models.CASCADE) # 关联Student模型的外键 course = models.ForeignKey(Course,on_delete=models.CASCADE) # 关联Course模型的外键 score = models.FloatField()
1.添加不负责维护关系的“多方”
stu1 = Student.objects.create(name="张三",age=20,sex='男')
2.创建负责关联的“多方”
course1 = Course.objects.create(name='数学')
3.创建第三方关系
使用实例化对象关联sc1 = Student_Course.objects.create(student=stu1,course=course1,score=85)
使用外键值关联sc3 = Student_Course.objects.create(student_id=3,course_id=1,score=69)
4.从不负责的多方查询另一个多方
例如:1号学生选的课程 student1 = Student.objects.get(id=1) courses = student1.course_set.all() # 对方模型类小写_set
5.从负责关联的多方查询另一个多方
例如:查询选择2号课程的学生course2 = Course.objects.get(id=2)students = course2.stu.all() # stu为关联类属性
6.代码演示
1、models
from django.db import models class Student(models.Model):name = models.CharField(max_length=10)age = models.IntegerField()sex = models.CharField(max_length=10) def __str__(self):return self.name class Meta:db_table = 'many_students' class Course(models.Model):name = models.CharField(max_length=10)stu = models.ManyToManyField(Student,through="Student_Course") # 多对多关系 def __str__(self):return self.name class Meta:db_table = 'courses' class Student_Course(models.Model): # 中间模型,负责维护两个“多方”模型student = models.ForeignKey(Student,on_delete=models.CASCADE) # 关联Student模型的外键course = models.ForeignKey(Course,on_delete=models.CASCADE) # 关联Course模型的外键score = models.FloatField() class Meta:db_table = 'student_course'
2、MySQL
ywh@ubuntu:~$ mysql -u root -p Enter password: Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 3 Server version: 5.7.23-0ubuntu0.16.04.1 (Ubuntu) Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql> use mydb Reading table information for completion of table and column names You can turn off this feature to get a quicker startup with -A Database changed mysql> show tables; +----------------------------+ | Tables_in_mydb | +----------------------------+ | articles | | auth_group | | auth_group_permissions | | auth_permission | | auth_user | | auth_user_groups | | auth_user_user_permissions | | cakes | | cards | | django_admin_log | | django_content_type | | django_migrations | | django_session | | myapp_product | | person | | schools | | students | | workers | +----------------------------+ 18 rows in set (0.00 sec) mysql> show tables; +----------------------------+ | Tables_in_mydb | +----------------------------+ | articles | | auth_group | | auth_group_permissions | | auth_permission | | auth_user | | auth_user_groups | | auth_user_user_permissions | | cakes | | cards | | courses | | django_admin_log | | django_content_type | | django_migrations | | django_session | | many_students | | myapp_product | | person | | schools | | student_course | | students | | workers | +----------------------------+ 21 rows in set (0.00 sec) mysql> desc student_course; +------------+---------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +------------+---------+------+-----+---------+----------------+ | id | int(11) | NO | PRI | NULL | auto_increment | | score | double | NO | | NULL | | | course_id | int(11) | NO | MUL | NULL | | | student_id | int(11) | NO | MUL | NULL | | +------------+---------+------+-----+---------+----------------+ 4 rows in set (0.01 sec) mysql> show creat table student_course; ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that nds to your MySQL server version for the right syntax to use near 'creat table sourse' at line 1 mysql> show create table student_course; +----------------+------------------------------------------- | Table | Create Table | student_course | CREATE TABLE `student_course` (`id` int(11) NOT NULL AUTO_INCREMENT,`score` double NOT NULL,`course_id` int(11) NOT NULL,`student_id` int(11) NOT NULL,PRIMARY KEY (`id`),KEY `student_course_course_id_16fdadee_fk_courses_id` (`course_id`),KEY `student_course_student_id_b55d2772_fk_many_students_id` (`student_id`),CONSTRAINT `student_course_course_id_16fdadee_fk_courses_id` FOREIGN KEY (`cou REFERENCES `courses` (`id`),CONSTRAINT `student_course_student_id_b55d2772_fk_many_students_id` FOREIGN KEent_id`) REFERENCES `many_students` (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 | +----------------+------------------------------------------- 1 row in set (0.01 sec) mysql> select * from django_migrations; +----+--------------+------------------------------------------+--------------------+ | id | app | name | applied | +----+--------------+------------------------------------------+--------------------+ | 1 | contenttypes | 0001_initial | 2018-10-07 09:0333 | | 2 | auth | 0001_initial | 2018-10-07 09:0574 | | 3 | admin | 0001_initial | 2018-10-07 09:0514 | | 4 | admin | 0002_logentry_remove_auto_add | 2018-10-07 09:0510 | | 5 | admin | 0003_logentry_add_action_flag_choices | 2018-10-07 09:0498 | | 6 | contenttypes | 0002_remove_content_type_name | 2018-10-07 09:0023 | | 7 | auth | 0002_alter_permission_name_max_length | 2018-10-07 09:0994 | | 8 | auth | 0003_alter_user_email_max_length | 2018-10-07 09:0963 | | 9 | auth | 0004_alter_user_username_opts | 2018-10-07 09:0950 | | 10 | auth | 0005_alter_user_last_login_null | 2018-10-07 09:0923 | | 11 | auth | 0006_require_contenttypes_0002 | 2018-10-07 09:0917 | | 12 | auth | 0007_alter_validators_add_error_messages | 2018-10-07 09:0910 | | 13 | auth | 0008_alter_user_username_max_length | 2018-10-07 09:0883 | | 14 | auth | 0009_alter_user_last_name_max_length | 2018-10-07 09:0827 | | 15 | myapp | 0001_initial | 2018-10-07 09:0813 | | 16 | sessions | 0001_initial | 2018-10-07 09:0789 | | 17 | myapp | 0002_article | 2018-10-08 02:4833 | | 18 | managerapp | 0001_initial | 2018-10-09 06:2514 | | 19 | homework | 0001_initial | 2018-10-10 01:1268 | | 20 | one2mangapp | 0001_initial | 2018-10-10 04:4523 | | 21 | one2oneapp | 0001_initial | 2018-10-11 14:0905 | | 22 | many2manyapp | 0001_initial | 2018-10-26 01:1869 | +----+--------------+------------------------------------------+--------------------+ 22 rows in set (0.00 sec) mysql> select * from many_students; +----+--------+-----+-----+ | id | name | age | sex | +----+--------+-----+-----+ | 1 | 张三 | 20 | 男 | | 2 | 李四 | 22 | 男 | | 3 | 李四 | 22 | 男 | | 4 | 王五 | 26 | 男 | +----+--------+-----+-----+ 4 rows in set (0.01 sec) mysql> select * from courses; +----+--------+ | id | name | +----+--------+ | 1 | 数学 | | 2 | 英语 | | 3 | python | +----+--------+ 3 rows in set (0.02 sec) mysql> select * from student_course; +----+-------+-----------+------------+ | id | score | course_id | student_id | +----+-------+-----------+------------+ | 1 | 85 | 1 | 1 | | 3 | 95 | 3 | 2 | | 4 | 90 | 3 | 4 | | 5 | 80 | 2 | 3 | +----+-------+-----------+------------+ 4 rows in set (0.00 sec) mysql> select * from student_course; +----+-------+-----------+------------+ | id | score | course_id | student_id | +----+-------+-----------+------------+ | 1 | 85 | 1 | 1 | | 3 | 95 | 3 | 2 | | 4 | 90 | 3 | 4 | | 5 | 80 | 2 | 3 | | 6 | 75 | 2 | 2 | +----+-------+-----------+------------+ 5 rows in set (0.00 sec) mysql> select * from many_students; +----+--------+-----+-----+ | id | name | age | sex | +----+--------+-----+-----+ | 1 | 张三 | 20 | 男 | | 2 | 李四 | 22 | 男 | | 3 | 李四 | 22 | 男 | | 4 | 王五 | 26 | 男 | +----+--------+-----+-----+ 4 rows in set (0.00 sec) mysql> select * from many_students; +----+--------+-----+-----+ | id | name | age | sex | +----+--------+-----+-----+ | 1 | 张三 | 20 | 男 | | 3 | 李四 | 22 | 男 | | 4 | 王五 | 26 | 男 | +----+--------+-----+-----+ 3 rows in set (0.01 sec) mysql> select * from student_course; +----+-------+-----------+------------+ | id | score | course_id | student_id | +----+-------+-----------+------------+ | 1 | 85 | 1 | 1 | | 4 | 90 | 3 | 4 | | 5 | 80 | 2 | 3 | +----+-------+-----------+------------+ 3 rows in set (0.00 sec) mysql> select * from courses; +----+--------+ | id | name | +----+--------+ | 1 | 数学 | | 2 | 英语 | | 3 | python | +----+--------+ 3 rows in set (0.00 sec) mysql> select * from courses; +----+--------+ | id | name | +----+--------+ | 1 | 数学 | | 2 | 英语 | +----+--------+ 2 rows in set (0.00 sec)
3、Terminal
Microsoft Windows [版本 10.0.17763.55] (c) 2018 Microsoft Corporation。保留所有权利。pytho C:\python\DjangoDay41>python manage.py makemigrations Migrations for 'many2manyapp':many2manyapp\migrations\0001_initial.py- Create model Course- Create model Student- Create model Student_Course- Add field stu to course C:\python\DjangoDay41>python manage.py migrate Operations to perform:Apply all migrations: admin, auth, contenttypes, hom ework, many2manyapp, one2mangapp, one2oneapp, sessions Running migrations:Applying many2manyapp.0001_initial... OK C:\python\DjangoDay41>python manage.py shell Python 3.7.0 (v3.7.0:1bf9cc5093, Jun 27 2018, 04:59:51 ) [MSC v.1914 64 bit (AMD64)] on win32 Type "help", "copyright", "credits" or "license" for m ore information. (InteractiveConsole) >>> from many2manyapp.models import * >>> >>> stu1 = Student.objects.create(name="张三",age=20,s ex='男') >>> course1 = Course.objects.create(name='数学') >>> sc1 = Student_Course.objects.create(student=stu1,c ourse=course1,score=85) >>> stu1 = Student.objects.create(name="李四",age=22,s ex='男') >>> stu2 = Student.objects.create(name="李四",age=22,s ex='男') >>> stu3 = Student.objects.create(name="王五",age=26,s ex='男') >>> course2 = Course.objects.create(name='英语') >>> course3 = Course.objects.create(name='python') >>> sc2 = Student_Course.objects.create(student=stu1,c ourse=course3,score=95) >>> sc3 = Student_Course.objects.create(student=stu3,c ourse=course3,score=90) >>> sc3 = Student_Course.objects.create(student=stu2,c ourse=course2,score=80) >>> sc2 = Student_Course.objects.create(student=stu1,c ourse=course2,score=75) >>> student1 = Student.objects.get(id=1) >>> student1 = Student.objects.get(id=2) >>> courses = student1.course_set.all() >>> for course in courses: ... print(course) ... 英语 python >>> student1 = Student.objects.get(id=3) >>> courses = student1.course_set.all() >>> for course in courses: ... print(course) ... 英语 >>> >>> course2 = Course.objects.get(id=2) >>> students = course2.stu.all() >>> for i in students: ... print(i.name) ... 李四 李四 >>> students = course3.stu.all() >>> for i in students: ... print(i.name) ... 李四 王五 >>> student1 = Student.objects.get(id=2) >>> student1.delete() (3, {'many2manyapp.Student_Course': 2, 'many2manyapp.S tudent': 1}) >>> course = Course.objects.get(id=3) >>> course.delete() (2, {'many2manyapp.Student_Course': 1, 'many2manyapp.C ourse': 1})
web后端--Django学习笔记04相关推荐
- 千锋Django学习笔记
千锋Django学习笔记 文章目录 千锋Django学习笔记 写在前面 1. MVC和MTV 2. Django简介 3. MTV简单流程 4. 和Model的简单对接 5. Model 6. Tem ...
- JavaWeb黑马旅游网-学习笔记04【BaseServlet抽取】
Java后端 学习路线 笔记汇总表[黑马程序员] JavaWeb黑马旅游网-学习笔记01[准备工作] JavaWeb黑马旅游网-学习笔记02[注册功能] JavaWeb黑马旅游网-学习笔记03[登陆和 ...
- JavaWeb-综合案例(用户信息)-学习笔记04【删除选中功能】
Java后端 学习路线 笔记汇总表[黑马程序员] JavaWeb-综合案例(用户信息)-学习笔记01[列表查询] JavaWeb-综合案例(用户信息)-学习笔记02[登录功能] JavaWeb-综合案 ...
- django 学习笔记
django 学习笔记 启动虚拟机: workon bj18_py3 创建一个项目: django-admin.py startproject mysite 启动开发用服务器:从外层项目 mysite ...
- Django学习笔记---第一天
Django学习笔记 1.Django的安装 //如果不指定版本号,默认安装最新版 pip3 install django==1.11.8 关于Django的版本和python的版本依赖关系,请看下图 ...
- 梅科尔工作室-Django学习笔记(二次学习)(3)
本次学习的是如何用django实现前端鸿蒙OS登录 下面介绍一下本次的操作过程. 1.首先创立MySQL数据并将数据库导入到django当中 其中:导入数据库的操作: 2.配置urls 对应新建的pe ...
- 前后端分离学习笔记(5) ---[表单的增删改操作;以及为管理员上传头像]
上一篇案例中也是查询到了表单的内容–>前后端分离学习笔记(4) -[路由嵌套, 查询表单显示] 文章目录 1.前端组件页面 添加管理员操作 修改管理员信息 删除管理员 为管理员上传头像 修改密码 ...
- 取得 Git 仓库 —— Git 学习笔记 04
取得 Git 仓库 -- Git 学习笔记 04 我认为, Git 的学习分为两大块:一是工作区.索引.本地版本库之间的交互:二是本地版本库和远程版本库之间的交互.第一块是基础,第二块是难点. 下面, ...
- JavaScript学习笔记04【高级——DOM和事件的简单学习、BOM对象】
w3school 在线教程:https://www.w3school.com.cn JavaScript学习笔记01[基础--简介.基础语法.运算符.特殊语法.流程控制语句][day01] JavaS ...
最新文章
- AMAB interconnector PL301(二)
- 图像中里面的Ground Truth
- Centos 7.x 设置Lvs+ Keepalived
- Ubuntu xrdp 遠端桌面連線
- LDP传输地址配置——Vecloud
- jmeter命令行压测
- 怪怪设计论闲谈篇:职责与解耦的矛盾
- filepermission java,Java FilePermission getActions()方法与示例
- 分布式对象存储 读书笔记(一) 开始
- java复制arraylist_Java - 复制ArrayList
- 使用寄存器点亮LED——编程实战
- docker安装(2018-03-14版本)
- 实习语录@秒针系统[上]
- 兔子未来的方向在哪里
- utilities——比较与排序规则(C++)
- RocketMQ调优总结(system busy或broker busy报错解决)
- 计算机黑屏时间,电脑开机黑屏时间长怎么办?Win10开机黑屏时间很久的解决方法...
- 中国工程师如何获 Google 的工作机会?
- 利用matplotlib实现TMDB电影数据可视化
- leetcode406:const、、static
热门文章
- android hint属性含义,android:hint属性对TextView的影响
- C++ new和delete的原理分析
- java高级之JDBC的基本操作知识
- 手机长按android版本,微信长按这个功能,可以触发高级操作,只有安卓手机才有...
- 实打实的方式VS对方是否
- JSP设置表格边框为单实线
- java 取消引用_java编译时所说的“无法取消引用”是什么意思
- Azure Synapse Analytics (Azure SQL DW)性能优化指南(1)——使用有序聚集列存储索引优化性能
- 网络通信——下载管理器DownloadManager——在通知栏显示下载进度
- python的self.boardx -= 5 什么意思_python小白求帮助