一对一的关联关系多用在当一张表的不同字段查询频次差距过大的情况下,将本可以存储在一张表的字段拆开放置在两张表中,然后将两张表建立一对一的关联关系。
字段:OneToOneField
字段参数
to:设置要关联的表。
to_field:设置要关联的字段。
on_delete: 同ForeignKey字段。
class IdCard(models.Model):
num = models.CharField(max_length=32,unique=True)
address = models.CharField(max_length=32)
def __str__(self):
return 'num : {}'.format(self.num)
class User(models.Model):
name = models.CharField(max_length=32)
age = models.IntegerField()
idcard = models.OneToOneField(to='IdCard',on_delete=models.CASCADE,to_field='num')
def __str__(self):
return 'name : {}'.format(self.name)
增加
#增
#常规方法
#save()
id_card = models.IdCard()
id_card.num = '119'
id_card.address = '火警'
id_card.save()
#create()
models.User.objects.create(
name = '王五',
age = 12,
idcard=id_card
)
修改
# 正向
user = models.User.objects.get(name='王五')
user.idcard.address = '消防局'
user.idcard.save()
# 反向
idcard = models.IdCard.objects.get(num='120')
idcard.user.name = '赵四'
idcard.user.save()
return HttpResponse('sssssss')
查找
#正向查找
user = models.User.objects.get(name='赵四')
print(user.idcard) #num : 120
print(user.idcard.address)#医院
#反向查找
idcard = models.IdCard.objects.get(num='120')
print(idcard.user)#name : 赵四
print(idcard.user.name)#赵四
删除
#delete()方法(两个表格中的记录都需要手动删除)
models.User.objects.get(name='王五').delete()
models.IdCard.objects.get(num='119').delete()