django-表关系之一对一
实现一对一的的关系
在models.py中,创建两个ORM模型
from django.db import models class FrontUser(models.Model): username = models.CharField(max_length=200) class UserExtension(models.Model): school = models.CharField(max_length=100) user = models.OneToOneField('FrontUser',on_delete=models.CASCADE) #OneToOneField 是一对一
接着使用以下两条命令映射到数据库即可
python manage.py makemigrations
python manage.py migrate
然后再views.py中
from django.http import HttpResponse from frontuser.models import FrontUser,UserExtension def one_to_one_view(request): user = FrontUser.objects.first() #获取该表下的第一条数据 extension = UserExtension(school='zhangs') #往该表插入数据 extension.user = user #绑定这个关系 extension.save() #保存这个数据在数据库 return HttpResponse('success') #然后在urls.py中映射即可
基本的查询数据:
def one_to_one_view(request): # 关联一对一关系 # user = FrontUser.objects.first() #获取该表下的第一条数据 # # extension = UserExtension(school='zhangs') #往该表插入数据 # extension.user = user #绑定这个关系 # extension.save() #保存这个数据在数据库 #查询数据 extension = UserExtension.objects.first() print(extension.user) return HttpResponse('success')
查询该表下的扩展信息(也就是关联的那个表的信息):
和一对多的关系类似
def one_to_one_view(request): #查询扩展信息 user = FrontUser.objects.first() print(user.userextension.school) #django会自动为你创建这个查询方法,名称也就是你关联那张表的小写形式,后面在.上你想要查的外键字段名称即可 return HttpResponse('success')
更改查询扩展信息的名称(默认方法是关联那张表的小写名称):
在关联那张表中增加一个参数,起一个自定义名称即可
也就是在models.py中 related_name='extension'
class UserExtension(models.Model): school = models.CharField(max_length=100) user = models.OneToOneField('FrontUser',on_delete=models.CASCADE,related_name='extension') #OneToOneField 是一对一
接着在views.py中使用这个名称即可
def one_to_one_view(request): #查询扩展信息 user = FrontUser.objects.first() print(user.extension.school) #方法改为了自定义的extension return HttpResponse('success')