zoukankan      html  css  js  c++  java
  • Django 学习第八天——Django模型基础第三节

    一、表关系的实现:

     

      一对一:OneToOne(外键+唯一键)

    xxx = models.OneToOneField('关联的表',on_delete=models.CASCADE)

        外键和一对一关系的时候需要加 on_delete 选项,此参数为了避免两个表里的数据不一致问题,不然会报错! 使用 CASCADE 表示级联删除:关联表中的数据删除了,这张表中对应的数据也会删除

      一对多:OneToMany(外键)

    xxx = models.ForeignKey('关联的表',on_delete=models.SET_NULL,null=True)

        外键和一对一关系的时候需要加 on_delete 选项,此参数为了避免两个表里的数据不一致问题,不然会报错! 使用 SET_NULL 表示关联表中数据删除不会影响到该表中数据,该字段就为空;加上非空键,让这条字段可以为空

      多对多:ManyToMany(表关联:外键+联合唯一)

        #只需要一个字段和id时不用创建第三张表,会自动创建第三张表

    xxx = models.ManyToMany('关联的表')

        # 如果还有其他字段时,就需要创建中间表

    xxx = models.ManyToMany('关联的表',through='通过第三张表关联')

      创建模型类

     

        执行完 makemigrations 和 migrate 的命令后,在数据库我们能看到5张表,其中多对多关系的ManyToManyField 方法自动生成了关系表.

    二、关联表的数据操作:

      一对多表关系数据操作:

      正向:一个模型如果定义了一个外键字段,通过这个模型操作外键就叫正向

        增,改:

          第一种:跟之前一样,用传参的方法添加,需要注意的是外键的值必须是关联表中已经存在的值

     

          第二种:用属性赋值的方式,因为我们再模型类有定义一个 xxx 的属性,而这个属性的对象的类型必须是 xxx 表的类实例对象

    外键 关联的表中的数据必须是已存在的(该表中的 外键字段_id 相当于关联表中的 id)

     

        删:

          外键字段必须加上 null=True 才能删除

          查出该字段,赋值为 None 就可以删除了

        查:

          表实例. 外键字段. 关联表中的字段

     

        要查某个学院有多少个学生:

          学生表.objects.filter(外键字段__学院名字段=’学院‘)

      反向:从关联表的表反过来查关联它的表的数据

        如果模型I有一个ForeignKey,那么该ForeignKey 所指的模型II实例可以通过一个管理器回前面有ForeignKey的模型I的所有实例。默认情况下,这个管理器的名字为 源模型的小写名_setfoo_set)

        可以再定义是设置 related_name 参数来覆盖 源模型的小写名_set 的名称

      增:

        关联表的实例. 小写源表名_set. create( )

        关联表的实例. 小写源表名_set. add( )

     

      查:

        关联表的实例. 小写源表名_set. 单表查询的所有方法都可以用

     

      删:

        删一个:

          关联表的实例. 小写源表名_set. remove(要删除的数据)

        删多个:

          关联表的实例. 小写源表名_set. remove(要删除的数据,要删除的数据)

        删完:

          关联表的实例. 小写源表名_set. clear()

      改:

        关联表的实例. 小写源表名_set. set([添加的数据,添加的数据])

          会先执行 clear() 方法在添加

      多对多表关系数据操作:

        没有指定中间表的时候:

          add,remove,set 都不能用了,必须用中间表操作数据

        有指定中间表的时候:

     

        不借助中间表,关联的表可以相互访问,查询

      一对一表关系数据操作:

        正向和一对多相似

        反向;直接通过 模型的小写 ;不用 _set 了

    三、跨表查询:

      Django 提供一种强大而又直观的方式来“处理”查询中的关联关系,它在后台自动帮你处理JOIN。 若要跨越关联关系,只需使用关联的模型字段的名称,并使用双下划线分隔,直至你想要的字段:

      例如:

    # 查询学院名字为‘计算机学院’的学生的信息 
    
    Student.objects.filter(department__name='计算机学院')

        它还可以反向工作。若要引用一个“反向”的关系,只需要使用该模型的小写的名称。

    #查询学生名字中包含 '小' 的学生的学院信息 
    Department.objects.filter(student__name__contains='') # contains 模糊查询
    # 查询学号为1的学生所有的课程 
    Course.objects.filter(student__s_id=1) 
    
    # 查询报了课程1的所有的学生 
    Student.objects.filter(course__c_id=1) 
    
    # 查询报了'python'课程的的学生的所属学院的信息 
    Department.objects.filter(student__course__name='python') 
    
    # 查询报了'english'课程的 33 期的学员 
    Student.objects.filter(course__name='english',grade__num='33')
  • 相关阅读:
    勤于思考:jquery.getJSON的缓存问题的解决方法
    步步为营:SQLServer查询随机不相同的记录插入临时表
    勤于思考:Asp.Net MVC Html.TextBoxFor日期格式化
    勤于思考:Excel写公式换算单元格求积等
    步步为营:ASP.NET MVC中Area分层模块处理大解密
    步步为营:因为数据库正在使用,所以无法获得对数据库的独占访问权
    勤于思考:从客户端中检测到有潜在危险的 Request.Form 值
    Android天天数钱游戏项目源码
    iOS猜拳游戏源码
    李开复:AlphaGo 若打败了世界冠军,意味着什么?
  • 原文地址:https://www.cnblogs.com/2018-8-31/p/10497828.html
Copyright © 2011-2022 走看看