zoukankan      html  css  js  c++  java
  • Django多表操作

    多表操作

       '好朋友胡斌在当今社会结婚后 发现我国的婚姻法规定中国执行的是一夫一妻制.结婚后老婆生了三个儿子, 有一天老婆问他儿子的爸爸是谁 ,他很骄傲的说儿子们的爸爸肯定是我,就是一对多的关系,她老婆笑着说:我和儿子是一对多关系,你就不一定了,有可能也是多对多关系!........胡斌红着脸就打开了电脑,就学起Django中的多表关系,还意淫着穿越到唐朝,享受一夫多妻制的性福生活.'
    

    一.创建模型

    '表和表之间的关系:
    list1:老公表
    list2:老婆表
    list3:孩子表
    list4:幼儿园小朋友表
    '注意:假设胡斌的老婆比较浪,他和孩子没有关系
    根据上面的小故事大家就会容易的明白老公和老婆是一对一的关系,老婆(妈妈)和孩子就是一对多的关系,孩子和幼儿园小朋友的表是多对多的关系(同学关系)   根据浅显的逻辑我们就可以建立关系表结构.
    
    

    老公表

    class Husband(models.Model):
      name=models.CharField(max_length=True)
      age=models.IntegerField()
    

    老婆(妈妈)表

    class Wife(models.Model):
      name=models.CharField(max_length=True)
      age=models.IntegerField()
      husbands=models.OneToOneField(to='HUSBAND',on_field=models.CASCADE)
    

    孩子表

    class Children(models.Model):
      name=models.CharField(max_length=True)
      age=models.IntegerField()
      wifes=models.ForeignKey("Wife",on_delete=models.CASCADE)
      
    

    小朋友表

    class Friend(models.Model):
      name=models.CharField(max_length=True)
      age=models.IntegerField()
      Childrens=models.ManyToManyField(to='Children',)
    

    表建立好了就可以使用数据库迁移在指定的数据库进行数据库迁移

    python3.6 manage.py makemigration
    python3.6 migrate
    
    增加
    '一对一:'
    models.Husband.objects.create(
            name='胡斌'
            age='17')
    models.Wife.objects.create(
            name='东盟'
            age='17'
            husbands=models.Husband.objects.get(id=1))
    models.Wife.objects.create(
            name='东盟'
            age='17'
            husbands=2
      '一对多:'
      models.Children.objects.create(
             name='小胡斌'
             age = '2'
             wifs=models.Wife.objects.get(id=1))
     models.Children.objects.create(
             name='小胡斌'
             age = '2'
             wifs='1'
     '多对多:'
       '方式一:
     friend_obj=models.Friend .objects.get(id=1)
     child1=models.Children.objects.get(id=1)
     child2=models.Children.objects.get(id=2) 
     
     friend_obj.childrens.add(child1, child2)
       '或者
     friend_obj.childrens.add(*[child1, child2])
      
     '方式二:
     friend_obj=models.Friend .objects.get(id=1)
     friend_obj.childrens.add(1,2)  
      '或者
      friend_obj.childrens.add(*[1,2])    
    
    删除
    胡斌看见老婆浪的很就想着离婚:
     ' 一对一 和一对多的删除直接delete
      models.Wife.objects.get(id=1).delete()
      '多对多的删除
      friend_obj=models.Friend .objects.get(id=1)
      friend_obj.childrens.remove(3)  '删除'  '就是孩子和小朋友打架了,从此解除了朋友关系'
      friend_obj.childrens.remove(2,3)
      friend_obj.childrens.clear()  '清空'
      '修改操作':
        friend_obj.childrens.set('4',)   "就是先清空在添加"==clear + add
    
    修改
    '修改 update,一对一 和一对多操作时就是和单表操作一样的'
    models.Wife.objects.filter (id=1).update(
              name='丁杰',
              age='12',
      
                     )
    
    '有一天,小胡斌发现他真正的好朋友不是现在的需要喊一个,这时候就发成了修改多对多的关系'
     models.Children.objects.filter (id=1).update(
              name='小熊熊帅哥',
              age='5',   
              childrens=models.Children.objects.get(id=6)
                '或者'
              childrens_id=3
    
    
    
    
    
    查询
    基于对象的跨表查询
    一对一
    正向查询
    查询东盟的老公的名字
    husband_obj=models.Wife.objects.get(name='东盟')
    husband_obj.husbands.name    'husbands就是外键也就是老婆表中的一个属性''就是属性有关系'
    反向查询
    查询胡斌的老婆叫啥
    wife_obj=models.Husband.objects.get(name='胡斌').first()
    wife_obj.wife.name    '反向查询的就是与相关的类有关系'
    
    一对多
    正向查询
    小胡斌是谁生的
    ret = models.Children.objects.filter(name='小胡斌').first()
    ret.childrens.name
      
    反向查询
    东盟生了那些孩子
    ret=models.Wife.objects.filter(name='东盟')
    childs=ret.children_set.all().values('name')
    
    # 多对多
        # 正向查询
        # 白洁新版这本书的作者都有谁
        # book_obj = models.Book.objects.filter(title='白洁新版').first()
        # authors = book_obj.authors.all().values('name')
        # print(authors)
    
        # 反向查询
        # 查询一下金龙2写了哪些书
        jinlong2_obj = models.Author.objects.get(name='金龙2')
        ret = jinlong2_obj.book_set.all().values('title')
        print(ret)
        
        总结:正向查询靠属性
             反向查询靠小写类名_set
        
        
        
    
  • 相关阅读:
    [转] Linux 最大进程数, unable to create new native thread问题
    [转] Maven 从命令行获取项目的版本号
    [转]【JVM】调优笔记2-----JVM在JDK1.8以后的新特性以及VisualVM的安装使用
    DISCUZ 自定义模板
    Linux系统性能统计工具Sar和实时系统性能监控脚本
    shell脚本常规技巧
    Java中文编码小结
    json-smart 使用示例(推荐fastjson)
    HBase Java简单示例
    Ehcache BigMemory: 摆脱GC困扰
  • 原文地址:https://www.cnblogs.com/x-h-15029451788/p/11912548.html
Copyright © 2011-2022 走看看