django地址/用户模型类中外键的疑问补充

模型类中外键的指向

  • 注意点1:这个模型类中的外键关联另一个模型类时,有时候会用类名,有时候用类名的字符串,到底应该用哪种?

    • 其实加不加引号都行,对自己的建议是要么都加上引号,
      要么调用同一子应用时不加,不同子应用时加上引号
  • 注意点2:该怎么调用?

    • 指向的另一个模型类在同一个子应用的models中时(在一个文件中),
      --------------------------------------------------------->直接调用类名

    • 指向的另一个模型类在另一个子应用的models文件中时,
      ---------------------------------------------------------->子应用.模型类名
      django地址/用户模型类中外键的疑问补充

    • 注意点3:外键默认是存放的什么,另一张表的对象/该对象的id/其他字段?

      • 查看定义外键的源码,貌似什么也没写,只是该字段指向了另一个模型类,梅老板说是该对象的id,个人更倾向于外键内部存放了另一张表的对象(对象的地址)(类似于指针),
        • request.user.default_address<===>Address的一个对象
          得到的就应该是地址对象(那一行数据),
          • 因此可以解释下图直接将地址对象赋值给默认地址这个外键
            django地址/用户模型类中外键的疑问补充
          • 进而可以点出里面的属性(因为是个地址对象嘛)
            django地址/用户模型类中外键的疑问补充
    • 但是这样理解其实也还有个问题,地址表中的指向省市级表的那三个外键字段,在创建新地址的视图中,被赋值的时候,赋值的不是省市级对象,而是id值,好吧,我蒙了,所以到底是对象赋值给它,还是id赋值给它?难道这两种都可以?

      • 分析一下province和provine_id区别:
        难道 address.province_id<=====>address.province.id?

      • 上边分析的没错,仔细看下边图,address对象里面既有province外键(指向对象),也有province_id(指向对象id),所以哪种赋值方法都是可以的,它都能根据一个找的到,只是数据库保存的是id值
        瞬间一下子明白了,我的想法和梅老板说的都没错,两个东西而已。。

      • 不得不说,django设计还是挺完善的。果然大框架!
        django地址/用户模型类中外键的疑问补充django地址/用户模型类中外键的疑问补充
        django地址/用户模型类中外键的疑问补充

      • 虽然有两个东西:一个id,一个对象,django中不能更改外键的存的东西的,梅老板说drf框架可以更改,学到后边再来补充!

      • 额外扩展

        • 关于这个对象,其中有个create_time,这个是继承于basemodel的字段,它竟然包含多个字段,推测和DataTimeField有关,而不是单独的一个字符数据
          django地址/用户模型类中外键的疑问补充
          django地址/用户模型类中外键的疑问补充

数据库中相同的一行数据

  • 如果当前表中有了一条数据,又来了一条数据要保存,如果有全部相同,我们的建议是不要再存一条一样的数据,而是增加个字段记录个数,比如count,
  • 实例:同样的用户,又下了一个一摸一样的单子,数据库很宝贵,我们要尽量保证不要冗余(虽然设计数据库和表这个事情是dba和项目经理做的。。),至于下单的时间,我们可以单独创建一个表B,用来记录下单时间,只需要在这个表B上定义一个外键,指向这个用户就可以了,但是每次都得判断所有字段是否都相同,会牺牲服务器的效率,对表中字段不多的情况下,绝对是优大于劣
    这个事情梅老板今天提了一句,oldyang也讲过,应该是三范式的其中一个,顺便复习下三范式:
    • 三范式:

      django地址/用户模型类中外键的疑问补充

    • oldyang三范式(对上边精简):
      django地址/用户模型类中外键的疑问补充