Django中模型类,对象,外键和反外键的理解

为什么要有模型类?
以前,在pycharm中,我们可以使用连接数据库,发送字符串(sql语句)的方式来操作数据库(curd),但是这种会容易出现sql注入的问题,而且异常麻烦,我必须清楚的知道我要创建几张表,现在有几个表,什么字段?这就需要不断的发送sql语句,而且极不友好,可移植性差
既然类和对象在编程语言中及其常见,为什么不能有一种方式让类和数据库关联起来呢?
在django中,提供了简单方便的方式,orm映射,object realted mapping,一个对象对应一个关系型数据库,我们不再直接操作数据库,而是采用操作模型类的方式来修改表

模型类:

  • 类名====表

模型类生成的对象:

  • 一个对象====表中一行的数据

类属性:

  • 类属性====表中字段
  • 注意:字段必须对象去调用,
    比如:User.username就不行,User是个类,虽然类能直接调用类属性,但是不能直接使用,必须对象/方法去调用,比如User.objects.get(id = 1)
    ---->只有对象才能点出来

User.objects.get(*)的理解:

  • 首先,User是个类(表),它想拿取某几行,必须使用方法get/filter/all去过滤
  • User.objects是所有函数的集合(get/filter等),
  • User.objects.get()得到的是一个查询集合(query set),里面包含多个对象
    =========================================>也就是多行数据
    • User.objects.get(id = 1)得到的一个对象/一行数据,因为id唯一
      ======================>集合中如果只有一个,(对象1)==对象1
    • User.objects.get(name= ‘ll’)得到的是一个查询集,集合里面包含多个对象

request.user的理解:

  • 前端一定会发给一个request对象,每次写接口都必须接收这个request,
    其实这个request中包含很多属性,(请求行/头/体都能在里面拿的到,都是他的属性),
  • request.user===User表中一行数据
    • 这一行数据就是指定了当前使用的用户,包括username.mobile.emial等
    • 注意:如果是匿名用户,没登陆过,拿到user的肯定是空,数据库肯定找不到这个内容,也就无从谈它的字段了

request.user和User.object.get()的区别:
- request.user是指定的一行数据,指定的那个对象
- User.object.get()是对象集合

在理解外键/反外键时,建议去看一下https://mp.weixin.qq.com/s?src=11&timestamp=1556380128&ver=1572&signature=I0Ot1QkVxBcesqWbPPkLolY5tS8b5eSTyBzm50PHdEqn5Beb32kmZ9iARGJdAxH0iZxJglWFLB9SCJ0AR-qQL5EAqXrdjN6Ue19znd28Th9gR6eoWEgm2YK5ygWQNxZW&new=1

外键–>正向查询:

  • 外键是表中的一个字段(就是表中的那一列),每一个对象都有外键字段
  • 外键是一对一的,当前对象的外键,指向了另一张表的哪一行数据
  • 外键存放的是另一张表的id值,根据id值,就能找到另一张表的那一行
  • 在这里插入图片描述

类名_set—>反向查询:

  • 什么时候用:我想知道都有谁指向了我,让我能找到他们
  • 当ForeignKey没设置related_name参数,默认是通过关联表的名称加_set去查询
  • 得到的是查询集,指向我的那些对象的集合
  • 既然是集合,可以根据下标得到第几个对象,其中的哪个字段的值在这里插入图片描述

反外键:

  • 什么时候需要用到表中有两个以上外键字段

  •   用原来的set无法反定向到这两个中的哪一个外键
    
  • 在这里插入图片描述

  • 怎么解决:既然表中有两个以上的外键,为了区分他们,给他们分别起个别名

  •  related_name参数相当于给这个外键取了个别名,方便表中多个外键时候去识别
    
    • 注意1反外键解决的问题是表中有多个外键,让我知道谁的哪个外键指向我,但是别忘了它得到的是查询对象集,也就是一对多的关系,并不能唯一确定那一个对象,要想解决这个问题,还需要外键的一对一的关系才行
      ------->这就是为什么已经有address指向user的外键,还需要user再定义一个外键指向address,因为反外键一对多,得到多个地址,外键一对一,可以得到唯一一个地址
    • 注意2:反向外键是一对多的,得到的是对象集合,这个查询集不同于User.object这个方法集(猜测有可能是字段集),对象集只能用count方法,不能用get等方法,当然还可以更近一步,调用对象集.model.objects.get()
    • 注意3:当然还可以更近一步,调用对象集.model.objects.get(),对象集合里面面不光包含对象,它能拿到很多东西,其中就有个model类,就可以用这种方法了
      梅老板给的第二种解决方式
      在这里插入图片描述
      注意
  • 怎么使用

    • 类似于上边,类名_set<=====>换成别名
      在这里插入图片描述

图片集合

  • weichat原文(写的很详细):–>多看,理解,启发较大
    在这里插入图片描述
  • 梅老板的交流图:
    在这里插入图片描述
  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值