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