表关系的实现
- 一对一
-
1 from django.db import models 2 3 # Create your models here. 4 5 class Account(models.Model): 6 username = models.CharField(max_length=20) 7 password = models.CharField(max_length=50) 8 phonenum = models.CharField(max_length=20, default='') 9 c_time = models.DateTimeField(auto_now_add=True,) # 创建时间 10 11 12 class Detail(models.Model): 13 num = models.CharField(max_length=10, default='') 14 hobby = models.CharField(max_length=10, default='') 15 account = models.OneToOneField('Account', on_delete=models.CASCADE)
在对应表里面新加字段,使用models.OnToOneField方法,第一个参数接收对应表的类的字符串,第二个设置关联,当被关联的表被删除的时候,该表也会被删除
- 使用:
- 用Detail查询username
- Detail.objects.filter(num="3").first().account.username
- 当关联的字段不存在时,直接调用关联字段会报错
-
- 多级关系实现
1 from django.db import models 2 3 4 # Create your models here. 5 6 7 class Student(models.Model): 8 name = models.CharField(max_length=20) 9 cls = models.ForeignKey('Class', on_delete=models.SET_NULL, null=True) # 一对多外键关联 10 11 12 class Class(models.Model): 13 name = models.CharField(max_length=20) 14 15 16 class Source(models.Model): 17 name = models.CharField(max_length=20) 18 student = models.ManyToManyField(Student, through='StudentSource') # 多对多关联 19 20 21 class StudentSource(models.Model): # 自定义多对多第三张表 22 student = models.ForeignKey(Student, on_delete=models.CASCADE) 23 course = models.ForeignKey(Source, on_delete=models.CASCADE)
-
一对多关系:
-
使用ForeignKey关联另一张表
-
正向操作
-
创建关联
-
关联查询
-
删除关联
-
删除关联时,被删除的关联字典必须可以为null
-
设置为None
-
- 关联修改
-
- 反向操作:
- 反向创建关联: django会在被关联表的对象里新增加一个关联对象的类名的小写+__set的管理器,可以通过这个管理器对反向关联的对象进行操作。这个管理器具有大部分关联对象的正向管理器objects的方法,增删改差皆可以用过这个管理器实现。
- 添加和新增:
- 查询所有关联的对象:
-
删除关联对象
-
remove是删除一个,clear是删除所有。
-
-
改变关联对象
-
set方法会清空之前的数据(调用clear),然后再将set的对象关联起来
-
- 反向创建关联: django会在被关联表的对象里新增加一个关联对象的类名的小写+__set的管理器,可以通过这个管理器对反向关联的对象进行操作。这个管理器具有大部分关联对象的正向管理器objects的方法,增删改差皆可以用过这个管理器实现。
-
-
-
多对多关系
-
多对多使用ManyToManyField字段定义,如何没有指定through,那么会自动创建第三张表。当指定了中间表的时候,必须使用中间表的管理器对关联的两张表操作
-
1 from django.db import models 2 3 4 # Create your models here. 5 6 class Student(models.Model): 7 name = models.CharField(max_length=20) 8 9 10 class Role(models.Model): 11 role_name = models.CharField(max_length=20) 12 student = models.ManyToManyField(Student)
创建模型
-
添加student和role
-
正向添加和查询
-
反向添加和查询
-
-