表关系的数据库操作
model中内容
### D: 在look/models.pyfrom django.db import models# Create your models here.class Department(models.Model):d_id = models.AutoField(primary_key=True) # 允许自定义IDd_name = models.CharField(max_length=20) # 最大学院名称长度class Meta:db_table = 'department'def __str__(self):return self.d_nameclass Student(models.Model):s_id = models.AutoField(primary_key=True) # 允许自定义学生IDs_name = models.CharField(max_length=20) # 学生名字的最大长度为20class Meta:db_table = "student"def __str__(self):return self.s_name
数据库迁移
python manage.py check # 执行检查python manage.py makemigrations look # 指定迁移的apppython manage.py migrate # 执行迁移python manage.py sqlmigrate look 0001 # 打印迁移过程
验证迁移结果
mysql> show databases;+--------------------+| Database |+--------------------+| book || information_schema |+--------------------+2 rows in set (0.00 sec)mysql> use book;Database changedmysql> show tables;+----------------------------+| Tables_in_book |+----------------------------+| auth_group || auth_group_permissions || auth_permission || auth_user || auth_user_groups || auth_user_user_permissions || bookinfo || department || django_admin_log || django_content_type || django_migrations || django_session || student || user |+----------------------------+14 rows in set (0.00 sec)mysql> desc department;+--------+-------------+------+-----+---------+----------------+| Field | Type | Null | Key | Default | Extra |+--------+-------------+------+-----+---------+----------------+| d_id | int | NO | PRI | NULL | auto_increment || d_name | varchar(20) | NO | | NULL | |+--------+-------------+------+-----+---------+----------------+2 rows in set (0.00 sec)mysql> desc student;+---------------+-------------+------+-----+---------+----------------+| Field | Type | Null | Key | Default | Extra |+---------------+-------------+------+-----+---------+----------------+| s_id | int | NO | PRI | NULL | auto_increment || s_name | varchar(20) | NO | | NULL | || department_id | int | NO | MUL | NULL | |+---------------+-------------+------+-----+---------+----------------+3 rows in set (0.00 sec)mysql>
对数据表的增删改查
先创建department数据
mysql> select * from department;+------+--------+| d_id | d_name |+------+--------+| 1 | 文学院 |+------+--------+1 row in set (0.00 sec)
def add_student(request):"""添加学生信息"""st = Student(s_id=1, s_name='张三',department_id=1) # , department_id=1st.save()return HttpResponse('添加学生张三,id为1,成功!')
path("add_student/", views.add_student, name='add_student'), # 向数据库添加学生信息,名字和ID
向数据库添加学院数据
path("add_department/", views.add_department, name='add_department'), # 向数据库添加学院信息,包括ID以及名称
def add_department(request):de = Department(d_id=2, d_name='文学院2')de.save()return HttpResponse('添加文学院2以及ID成功!')
表关联对象的访问
特殊情况
字段可以设置逻辑删除,虽然程序显示删除但是数据库未发生改动;
is_delete = models.BooleanField(default=False, verbose_name='逻辑删除')
多表查询
课程目标
#查询学号为1的学生所有的课程Course.objects.filter(student_s_id=1)#查询报了课程1的所有的学生Student.objects.filter(course__c_id=1)#查询报了'python'课程的的学生的所属学院的信息Department.objects.filter(student_course__c_name='python')
第一个例子的查询逻辑
### 首先要求返回的结果是学院的名称,查询的条件是学生ID,查询的范围是学院表### 在学生表中,要有学生ID为1的学生对象,在学院表中,有学生表中ID为1的学生所填写的学院表ID对应的学院名称#### views.pydef research_by_filter(request):dat = Department.objects.filter(student__s_id=1)print(dat)print("在学院表中查询学号为1的学生:{}".format(dat))return HttpResponse("得偿所愿")#### urls.pypath("research_by_filter/", views.research_by_filter, name='research_by_filter'), # 使用filter方法查询数据#### 程序运行结果<QuerySet [<Department: 文学院>]>在学院表中查询学号为1的学生:<QuerySet [<Department: 文学院>]>
第二个例子的查询逻辑
### 学习目标:关联数据表的使用,通过学院查询学生ID### 在学院表中,必须要有学院ID为3的数据对象,在学生表中,必须有学生的学院ID为3### 可以匹配一个数据对象,也可以匹配多个数据对象### views.pydef research_by_filter2(request):dat = Student.objects.filter(department__d_id=3)print(dat)print("在学生表中查询学号为1的学生:{}".format(dat))return HttpResponse("得偿所愿")### urls.pypath("research_by_filter2/", views.research_by_filter2, name='research_by_filter2'), # 使用filter方法查询数据### 查询结果<QuerySet [<Student: 小明>, <Student: 小红>, <Student: 大家都想读计算机>]>在学院表中查询学号为1的学生:<QuerySet [<Student: 小明>, <Student: 小红>, <Student: 大家都想读计算机>]>
总结
表关联对象及多表查询
表关系的数据库操作:一对多查询
表—-模型类
字段—属性
自定义ID的属性
s_id = models.AutoField(primary_key=True)
多表的查询
