一 .ORM一对一表(OneToOneField)
1.创建ORM表
一对一关系与多对一关系非常相似。如果你在模型中定义一个OneToOneField,该模型的实例将可以通过该模型的一个简单属性访问关联的模型。
class Person(models.Model): name = models.CharField(max_length=20) class PersonDetail(models.Model): age = models.IntegerField(10) email = models.EmailField() person = models.OneToOneField(Person) # person = models.ForeignKey(Person, unique=True)
2. 查询
def one(request):
# 查询alex的用户信息 # 正向查询 ret = models.PersonDetail.objects.get(id=1) # ret = models.PersonDetail.objects.get(id=models.Person.objects.get(name='alex').id) # 这里的person是表中的关联外键的字段并非类名字 print(ret.person) # Person object 封装的Person对象 print(ret.person.name, ret.age, ret.email)
# 查询alex的用户信息 # 反向查询 obj = models.Person.objects.get(name='alex') # persondetail 类名字的小写 print(obj.persondetail) # PersonDetail object print(obj.name, obj.persondetail.email, obj.persondetail.age) return HttpResponse('OK')
反向”查询中有所不同。一对一关系中的关联模型同样具有一个管理器对象,但是该管理器表示一个单一的对象而不是对象的集合。 一对一的方式原理上是 ForeignKey + unique=True。但是既然是外键 那么一对多的反向查询方式应该和一对一的反向查询方式相同,
而实际上不是这样的,一对一的反向查询方式是 obj.persondetail 对象.类名小写 ,没有_set。
3. 一对一表 (案例 增删改查)
from django.db import models # 母表 class Colors(models.Model): colors = models.CharField(max_length=10) def __str__(self): return self.colors # 一对一关系,每一个球都只有一种颜色,每种颜色的球只有一个 class Ball(models.Model): # 球的颜色与 Color 母表的颜色一一对应 ball_color = models.OneToOneField('Colors') # 描述 description = models.CharField(max_length=10) def __str__(self): return self.description
查询数据
子表查询母表:
from myApp.models import Colors, Ball
方法一: 正向查找
# 查询“1号球”对应的颜色 # 获取一个子表对象 >>> b = Ball.objects.get(description="1号球") <Ball: 1号球>
# 获取对应的母表对象
>>> b.ball_color <Colors: red>
方法二:反向查找
# 获取“1号球”的 Colors 对象
>>> c = Colors.objects.get(ball__description="1号球")
<Colors: red>
>>> c.colors
'red'
母表查询子表:
方法一: 反向查找 # 查询红色球对应的描述 # 获取某 Colors 对象 >>> c = Colors.objects.get(colors="red") <Colors: red> # 获取对应的 Ball 对象 # 这里默认用子表名称的小写,如果设定了 related_name 则使用 related_name >>> c.ball <Ball: 1号球>
方法二: 正向查找
# 获取颜色为红的 Ball 对象
>>> b = Ball.objects.get(ball_color__colors="red")
<Ball: 1号球>
>>> b.description
'1号球'
添加数据
# 创建一个新的 Colors 对象 c = Colors.objects.create(colors="blue") # 创建一个新 Ball 对象 Ball.objects.create(ball_color=c,description="2号球")
删除数据
# 删除某个 Ball 对象 Ball.objects.get(description="2号球").delete() # 删除某个 Colors 对象 Colors.objects.get(colors="blue").delete() # 清空一张表 Colors.objects.all().delete()
修改数据
c = Colors.objects.get(colors="red") c.colors = 'yellow' c.save()
# save() 方法 c = Colors.objects.create(colors="green") b = Ball.objects.get(description="1号球") b.color = c b.description = "3号球" b.save()
# filter() 方法 b = Ball.objects.filter(description="3号球") # 注意:update() 和 delete() 是 QuerySet 的方法 b.update(ball_color=c,description="1号球")