1.模型创建
1 from django.db import models 2 class Student(models.Model): 3 name=models.CharField(max_length=32) 4 class Meta: 5 db_table='student' 6 class IdCard(models.Model): 7 idcard_no=models.IntegerField() 8 i_student=models.OneToOneField(Student) 9 class Meta: 10 db_table='idcard'
一对一相对于一对多就是在多的关系表中加了个唯一约束
1 # views.py中 2 # 主表添加 3 def addStudent(request): 4 student=Student() 5 student.name='fpx' 6 student.save() 7 return HttpResponse('添加成功') 8 # 从表添加 9 def addIdcard(request): 10 idcard=IdCard() 11 idcard.idcard_no=110 12 idcard.save() 13 return HttpResponse('添加成功') 14 # 设置外键可以为空,在models的一对一的从表中的外键添加null=True,blank=True 15 # 添加null=True,blank=True后需要重新迁移 16 i_student=models.OneToOneField(Student,null=True,blank=True) 17 # 一对一主表最后一条数据和从表最后一条数据进行绑定 18 def bind(request): 19 student=Student.objects.last() 20 idcard=IdCard.objects.last() 21 # 两种绑定方法 1. 22 idcard.i_student=student #从表的外键和主表的查询对象 23 # 2. 24 idcard.i_student_id=student.id 25 idcard.save() 26 return HttpResponse('绑定成功')
外键默认是不可以为空
3.删除数据
1 # 删除主表,默认是级联删除 2 def delStudent(request): 3 student=Student.objects.last() 4 student.delete() 5 return HttpResponse('添加成功') 6 # 修改on_delete的属性为models.SET_NULL(前提允许为空),那么删除主表,从表对应数据为null 7 # 添加on_delete=models.SET_NULL后需要重新迁移 8 i_student=models.OneToOneField(Student,null=True,blank=True,on_delete=models.SET_NULL) 9 # 删除主表数据,那么报错,修改on_delete=models.PROTECT 10 i_student=models.OneToOneField(Student,null=True,blank=True,on_delete=models.PROTECT)
删除主表,默认是级联删除(
OneToOneField
的属性有一个on_delete
的属性,该值为CASCADE
,所以是级联删除)SET_DEFAULT:置为默认值,前提存在默认值
SET:自己赋值 (SET(3)设置默认值为3)
以上没有级联关系,都会直接删除
4.查询数据
1 # 根据从表对象查询主表数据(显性) 2 def getStudent(request): 3 idcard=IdCard.objects.get(pk=3) 4 print(idcard.i_student.name) 5 return HttpResponse('添加成功') 6 #一对一查询,根据主表对象查询从表数据(隐性),那么可以使用主表对象.从表的模型名字小写eg:student.idcard 7 def getIdcard(request): 8 student=Student.objects.get(pk=3) 9 print(student.idcard.idcard_no) 10 return HttpResponse('查询成功')
一对多模型
1.模型创建
1 from django.db import models 2 class Dept(models.Model): 3 name=models.CharField(max_length=32) 4 class Meta: 5 db_table='dept' 6 class Emp(models.Model): 7 name=models.CharField(max_length=32) 8 e_dept=models.Foreignkey(Dept) 9 class Meta: 10 db_table='emp'
2.添加数据
1 # 主表添加 2 def addDept(request): 3 dept=Dept() 4 dept.name='开发部' 5 dept.save() 6 return HttpResponse('添加成功') 7 # 从表添加 8 def addEmp(request): 9 emp=Emp() 10 emp.name='tom' 11 emp.save() 12 return HttpResponse('添加成功') 13 # 设置外键可以为空,在models的一对多的从表中的外键添加null=True,blank=True 14 # 添加null=True,blank=True后需要重新迁移 15 e_dept=models.ForeignKey(Dept,null=True,blank=True)
3.绑定
1 def bind(request): 2 dept=Dept.objects.last() 3 emp=Emp.objects.last() 4 emp.e_dept=dept #从表的外键和主表的查询对象 5 emp.save() 6 return HttpResponse('绑定成功')
4.删除
1 # 删除主表,默认是级联删除 2 def delDept(request): 3 dept=Dept.objects.last() 4 dept.delete() 5 return HttpResponse('删除成功') 6 # 修改on_delete的属性为models.SET_NULL(前提允许为空),那么删除主表,从表对应数据为null 7 # 添加on_delete=models.SET_NULL后需要重新迁移 8 e_dept=models.ForeignKey(Dept,null=True,blank=True,on_delete=models.SET_NULL) 9 # 删除主表数据,那么报错,修改on_delete=models.PROTECT 10 e_dept=models.ForeignKey(Dept,null=True,blank=True,on_delete=models.PROTECT)
5.查询
1 # 主表查从表 2 def getEmps(request): 3 dept=Dept.objects.last() 4 for emp in dept.emp_set.all(): 5 print(emp.name) 6 return HttpResponse('查询成功') 7 # 从表查主表 8 def getDept(request): 9 emp=Emp.objects.last() 10 print(emp.e_dept.name) 11 return HttpResponse('查询成功')
多对多模型
1.模型创建
1 class Custom(models.Model): 2 name=models.CharField(max_length=32) 3 class Meta: 4 db_table='custom' 5 class Goods(models.Model): 6 name=models.CharField(max_length=32) 7 g_custom=models.ManyToManyField(Custom) 8 class Meta: 9 db_table='goods'
迁移成功后生成三张表,数据库模型中,主表和从表都正常(没有外键),第三张关系表有对应主表和从表的两个外键,两个外键联合唯一
2.添加数据
1 # 主表添加 2 def addCustom(request): 3 custom=Custom() 4 custom.name='tom' 5 custom.save() 6 return HttpResponse('添加成功') 7 # 从表添加 8 def addGoods(request): 9 good=Goods() 10 goods.name='apple' 11 goods.save() 12 return HttpResponse('添加成功') 13 # 添加关系 14 def addRelation(request): 15 custom=Custom.objects.last() 16 goods=Goods.objects.last() 17 # 两种添加关系的方法 18 custom.goods_set.add(goods) # 方法二goods.g_custom.add(custom) 19 return HttpResponse('添加成功')
3.删除数据
1 # 删除主表的数据,关系表的对应数据也会删除 2 def deleteCustom(request): 3 custom=Custom.objects.last() 4 custom.delete() 5 return HttpResponse('删除成功') 6 # 删除从表的数据,关系表的对应数据也会删除 7 def deleteGoods(request): 8 goods=Goods.objects.last() 9 goods.delete() 10 return HttpResponse('删除成功') 11 # 删除关系表的数据 12 def deleteRelation(request): 13 custom=Custom.objects.last() 14 goods=Goods.objects.last() 15 # 两种删除方式 16 custom.goods_set.remove(goods) # goods.g_custom.remove(custom) 17 return HttpResponse('删除成功')
关系表不能设置为空,和受保护
4.查询数据
1 # 主表查从表 2 def getGoods(request): 3 custom=Custom.objects.last() 4 goods_list=custom.goods_set.all() 5 for goods in goods_list: 6 print(goods.name) 7 return HttpResponse('查询成功') 8 # 从表查主表 9 def getCustom(request): 10 goods=Goods.objects.last() 11 custom_list=goods.g_custom.all() 12 # custom=goods.g_custom.first() 13 # custom.name 14 for custom in custom_list: 15 print(custom.name) 16 return HttpResponse('查询成功')