表关系的数据库操作

model中内容

  1. ### D: 在look/models.py
  2. from django.db import models
  3. # Create your models here.
  4. class Department(models.Model):
  5. d_id = models.AutoField(primary_key=True) # 允许自定义ID
  6. d_name = models.CharField(max_length=20) # 最大学院名称长度
  7. class Meta:
  8. db_table = 'department'
  9. def __str__(self):
  10. return self.d_name
  11. class Student(models.Model):
  12. s_id = models.AutoField(primary_key=True) # 允许自定义学生ID
  13. s_name = models.CharField(max_length=20) # 学生名字的最大长度为20
  14. class Meta:
  15. db_table = "student"
  16. def __str__(self):
  17. return self.s_name

数据库迁移

  1. python manage.py check # 执行检查
  2. python manage.py makemigrations look # 指定迁移的app
  3. python manage.py migrate # 执行迁移
  4. python manage.py sqlmigrate look 0001 # 打印迁移过程

验证迁移结果

  1. mysql> show databases;
  2. +--------------------+
  3. | Database |
  4. +--------------------+
  5. | book |
  6. | information_schema |
  7. +--------------------+
  8. 2 rows in set (0.00 sec)
  9. mysql> use book;
  10. Database changed
  11. mysql> show tables;
  12. +----------------------------+
  13. | Tables_in_book |
  14. +----------------------------+
  15. | auth_group |
  16. | auth_group_permissions |
  17. | auth_permission |
  18. | auth_user |
  19. | auth_user_groups |
  20. | auth_user_user_permissions |
  21. | bookinfo |
  22. | department |
  23. | django_admin_log |
  24. | django_content_type |
  25. | django_migrations |
  26. | django_session |
  27. | student |
  28. | user |
  29. +----------------------------+
  30. 14 rows in set (0.00 sec)
  31. mysql> desc department;
  32. +--------+-------------+------+-----+---------+----------------+
  33. | Field | Type | Null | Key | Default | Extra |
  34. +--------+-------------+------+-----+---------+----------------+
  35. | d_id | int | NO | PRI | NULL | auto_increment |
  36. | d_name | varchar(20) | NO | | NULL | |
  37. +--------+-------------+------+-----+---------+----------------+
  38. 2 rows in set (0.00 sec)
  39. mysql> desc student;
  40. +---------------+-------------+------+-----+---------+----------------+
  41. | Field | Type | Null | Key | Default | Extra |
  42. +---------------+-------------+------+-----+---------+----------------+
  43. | s_id | int | NO | PRI | NULL | auto_increment |
  44. | s_name | varchar(20) | NO | | NULL | |
  45. | department_id | int | NO | MUL | NULL | |
  46. +---------------+-------------+------+-----+---------+----------------+
  47. 3 rows in set (0.00 sec)
  48. mysql>

对数据表的增删改查

先创建department数据

  1. mysql> select * from department;
  2. +------+--------+
  3. | d_id | d_name |
  4. +------+--------+
  5. | 1 | 文学院 |
  6. +------+--------+
  7. 1 row in set (0.00 sec)
  • 向数据表增加学生类

  1. def add_student(request):
  2. """
  3. 添加学生信息
  4. """
  5. st = Student(s_id=1, s_name='张三',department_id=1) # , department_id=1
  6. st.save()
  7. return HttpResponse('添加学生张三,id为1,成功!')
  • 对应URL

  1. path("add_student/", views.add_student, name='add_student'), # 向数据库添加学生信息,名字和ID

向数据库添加学院数据

  1. path("add_department/", views.add_department, name='add_department'), # 向数据库添加学院信息,包括ID以及名称
  1. def add_department(request):
  2. de = Department(d_id=2, d_name='文学院2')
  3. de.save()
  4. return HttpResponse('添加文学院2以及ID成功!')

表关联对象的访问

特殊情况

字段可以设置逻辑删除,虽然程序显示删除但是数据库未发生改动;

  1. is_delete = models.BooleanField(default=False, verbose_name='逻辑删除')

多表查询

课程目标

  1. #查询学号为1的学生所有的课程
  2. Course.objects.filter(student_s_id=1)
  3. #查询报了课程1的所有的学生
  4. Student.objects.filter(course__c_id=1)
  5. #查询报了'python'课程的的学生的所属学院的信息
  6. Department.objects.filter(student_course__c_name='python')

第一个例子的查询逻辑

  1. ### 首先要求返回的结果是学院的名称,查询的条件是学生ID,查询的范围是学院表
  2. ### 在学生表中,要有学生ID为1的学生对象,在学院表中,有学生表中ID为1的学生所填写的学院表ID对应的学院名称
  3. #### views.py
  4. def research_by_filter(request):
  5. dat = Department.objects.filter(student__s_id=1)
  6. print(dat)
  7. print("在学院表中查询学号为1的学生:{}".format(dat))
  8. return HttpResponse("得偿所愿")
  9. #### urls.py
  10. path("research_by_filter/", views.research_by_filter, name='research_by_filter'), # 使用filter方法查询数据
  11. #### 程序运行结果
  12. <QuerySet [<Department: 文学院>]>
  13. 在学院表中查询学号为1的学生:<QuerySet [<Department: 文学院>]>

第二个例子的查询逻辑

  1. ### 学习目标:关联数据表的使用,通过学院查询学生ID
  2. ### 在学院表中,必须要有学院ID为3的数据对象,在学生表中,必须有学生的学院ID为3
  3. ### 可以匹配一个数据对象,也可以匹配多个数据对象
  4. ### views.py
  5. def research_by_filter2(request):
  6. dat = Student.objects.filter(department__d_id=3)
  7. print(dat)
  8. print("在学生表中查询学号为1的学生:{}".format(dat))
  9. return HttpResponse("得偿所愿")
  10. ### urls.py
  11. path("research_by_filter2/", views.research_by_filter2, name='research_by_filter2'), # 使用filter方法查询数据
  12. ### 查询结果
  13. <QuerySet [<Student: 小明>, <Student: 小红>, <Student: 大家都想读计算机>]>
  14. 在学院表中查询学号为1的学生:<QuerySet [<Student: 小明>, <Student: 小红>, <Student: 大家都想读计算机>]>

总结

表关联对象及多表查询

表关系的数据库操作:一对多查询

表—-模型类

字段—属性

自定义ID的属性

  1. s_id = models.AutoField(primary_key=True)

多表的查询