表关系的数据库操作
model中内容
### D: 在look/models.py
from django.db import models
# Create your models here.
class Department(models.Model):
d_id = models.AutoField(primary_key=True) # 允许自定义ID
d_name = models.CharField(max_length=20) # 最大学院名称长度
class Meta:
db_table = 'department'
def __str__(self):
return self.d_name
class Student(models.Model):
s_id = models.AutoField(primary_key=True) # 允许自定义学生ID
s_name = models.CharField(max_length=20) # 学生名字的最大长度为20
class Meta:
db_table = "student"
def __str__(self):
return self.s_name
数据库迁移
python manage.py check # 执行检查
python manage.py makemigrations look # 指定迁移的app
python 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 changed
mysql> 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=1
st.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.py
def research_by_filter(request):
dat = Department.objects.filter(student__s_id=1)
print(dat)
print("在学院表中查询学号为1的学生:{}".format(dat))
return HttpResponse("得偿所愿")
#### urls.py
path("research_by_filter/", views.research_by_filter, name='research_by_filter'), # 使用filter方法查询数据
#### 程序运行结果
<QuerySet [<Department: 文学院>]>
在学院表中查询学号为1的学生:<QuerySet [<Department: 文学院>]>
第二个例子的查询逻辑
### 学习目标:关联数据表的使用,通过学院查询学生ID
### 在学院表中,必须要有学院ID为3的数据对象,在学生表中,必须有学生的学院ID为3
### 可以匹配一个数据对象,也可以匹配多个数据对象
### views.py
def research_by_filter2(request):
dat = Student.objects.filter(department__d_id=3)
print(dat)
print("在学生表中查询学号为1的学生:{}".format(dat))
return HttpResponse("得偿所愿")
### urls.py
path("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)
多表的查询