我:本次继上次的Model继续延伸一下数据表之间的一对一映射关系
访客:有什么用?
我:众所周知,一张数据表的字段太多会显得冗余、杂乱,那么就需要将一张表进行拆分成多个表,这样不会太杂乱,也比较好维护
举例:每个人都有一张身份证,有且唯一一张,这里就存在一个 一对一的关系
一、Model建立
#一对一的模型实例: class Person(models.Model): p_name=models.CharField(max_length=16) p_sex=models.BooleanField(default=False) class IDCard(models.Model): id_num=models.CharField(max_length=18,unique=True) #一对一 id_person=models.OneToOneField(Person,on_donelete=models.CASCADE,null=True,blank=True)
这里有两点需要注意,
1.OneToOneField(映射的模型,Django2.X之后要加上的on_donelete属性)
2.id_num-----------unique=True
二、路由的设定:
from django.urls import path from App1 import views urlpatterns=[ path(r'hello/',views.hello,name='hello'), #一对一项目实例 path(r'addperson/',views.add_person,name='add_person'), path(r'addidcard/',views.add_idcard,name='add_idcard'), path(r'bindcard/',views.bind_card,name='bind_card'), ]
分别为:
- 添加人员信息
- 添加身份证信息
- 绑定身份证
三、View的构造:
#一对一实例 #添加人 def add_person(request): username=request.GET.get("username") person =Person() person.p_name=username person.save() return HttpResponse("Person创建成功!%d"% person.id) #添加身份证 def add_idcard(request): idnum=request.GET.get("idnum") idcard=IDCard() idcard.id_num=idnum idcard.save() return HttpResponse("IDCard %d"% idcard.id) def bind_card(request): person =Person.objects.last() idcard=IDCard.objects.last() idcard.id_person=person idcard.save() return HttpResponse("绑定成功!")
结果如下(大家感兴趣的也可以试试)