一对一(OneToOneField)

首先我们编辑 models.py,添加 Colors 和 Balls 两个对象:

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

在后台添加颜色 red,对应的球的描述为“1号球”。




查询数据

子表查询母表:

from myApp.models import Colors, Ball

# 查询“1号球”对应的颜色

# 获取一个子表对象
>>> b = Ball.objects.get(description="1号球")


# 获取对应的母表对象
>>> b.ball_color


# 查询该对象的 color 属性
>>> b.ball_color.colors
'red'


另一种方法:

# 获取“1号球”的 Colors 对象
>>> c = Colors.objects.get(ball__description="1号球")


>>> c.colors
'red'

母表查询子表:

# 查询红色球对应的描述

# 获取某 Colors 对象
>>> c = Colors.objects.get(colors="red")


# 获取对应的 Ball 对象
# 这里默认用子表名称的小写,如果设定了 related_name 则使用 related_name
>>> c.ball


>>> c.ball.description
'1号球

另一种方法:

# 获取颜色为红的 Ball 对象
>>> b = Ball.objects.get(ball_color__colors="red")


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

你可能感兴趣的:(一对一(OneToOneField))