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('查詢成功')