十一 .Django 一对一表OneToOneField (ORM)

Posted lovershowtime

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了十一 .Django 一对一表OneToOneField (ORM)相关的知识,希望对你有一定的参考价值。

一 .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号球")

 

 

 

 

 

 

 

以上是关于十一 .Django 一对一表OneToOneField (ORM)的主要内容,如果未能解决你的问题,请参考以下文章

Python学习之路—2018/6/26

web系列十一使用django创建数据库表

十一,这个重要的里程碑&&Django视频活动价

Django基础五之django模型层多表操作

Django

Django一对多表结构