Django中model中使用外鍵建立表之間關系


一對一模型

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'

一對一相對於一對多就是在多的關系表中加了個唯一約束

2.添加數據

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

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM