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’)得到的是一个查询集,集合里面包含多个对象
- User.objects.get(id = 1)得到的一个对象/一行数据,因为id唯一
request.user的理解:
- 前端一定会发给一个request对象,每次写接口都必须接收这个request,
其实这个request中包含很多属性,(请求行/头/体都能在里面拿的到,都是他的属性), -
request.user===User表中一行数据
- 这一行数据就是指定了当前使用的用户,包括username.mobile.emial等
- 注意:如果是匿名用户,没登陆过,拿到user的肯定是空,数据库肯定找不到这个内容,也就无从谈它的字段了
request.user和User.object.get()的区别:
- request.user是指定的一行数据,指定的那个对象
- User.object.get()是对象集合
外键–>正向查询:
- 外键是表中的一个字段(就是表中的那一列),每一个对象都有外键字段
- 外键是一对一的,当前对象的外键,指向了另一张表的哪一行数据
- 外键存放的是另一张表的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类,就可以用这种方法了
注意
-
注意1:反外键解决的问题是表中有多个外键,让我知道谁的哪个外键指向我,但是别忘了它得到的是查询对象集,也就是一对多的关系,并不能唯一确定那一个对象,要想解决这个问题,还需要外键的一对一的关系才行
-
怎么使用:
- 类似于上边,类名_set<=====>换成别名
- 类似于上边,类名_set<=====>换成别名
图片集合
- weichat原文(写的很详细):–>多看,理解,启发较大
- 梅老板的交流图: