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

     

  • 相关阅读:
    【转】日本留学——修士申请注意事项
    【转】日本留学读研究生和修士有什么区别?申请误区有哪些
    【转】为什么说学一门小语种,就能打开新世界的大门?
    【转】TED:两年一门外语--她总结了学外语的秘诀
    【转】为什么一定要学一门外语?
    【转】学完标准日本语初级至高级,可以过日语n1吗?
    【转】去日本语言学校前,日语应该达到几级呢?
    Cordova学习
    敏捷开发实录(二)
    Mac端博客发布工具推荐
  • 原文地址:https://www.cnblogs.com/lovershowtime/p/11355643.html
Copyright © 2020-2023  润新知