1.我们使用models对数据库进行查询的时候,想去拿到结果的时候有时直接使用".字段",有时是'[0].字段',区别就是我们使用的语句返回的到底是一个对象还是列表:

obj=models.table.objects.all()
obj=models.table.objects.filter()
#以上结果都是一个列表,列表中每个元素就是一条数据的对象.所以这个时候就需要obj[角标].字段去获取我们想要的字段数据
obj=models.table.all().values("字段")
obj=models.table.filter().values_list("字段")
#加上values()获取到的也是列表,只是列表内的元素变成了字典,字典对应的数据就是我们values(字段)中字段的数据,想要使用也需要obj[角标]['字段']
#对于get(条件)拿到的就是对应条件的对象,想使用就是直接'obj.字段'就可以了,使用get的时候返回结果只能是有且只有一个对象,不然报错
models.table.objects.get(条件)

2.下划线__查询:

#1:下划线__用于条件,使用在filter()中
models.table.objects.filter(id__gt=0,id__lt=3)#查询id大于0小于3的结果
models.table.objects.filter(id__in[1,2,3])#查询id在某几个值中的结果
models.table.objects.filter(id__range()1,100))#查询id在某个范围
models.table.objects.exclude(id__range(1,100))#不在某个范围
#类似的还有:
startswith,istartswith, endswith, iendswith,contains,icontains
#列举经典的书,作者,出版社模型
class People(models.Model):
uname=models.CharField(max_length=32)
age=models.IntegerField()
class Book(models.Model):
bname=models.CharField(max_length=32)
author=models.ForeignKey('People')
press=models.ManyToManyField("Press")
class Press(models.Model):
pname=models.CharField(max_length=32)
address=models.CharField(max_length=16)
#书和人是多对一,书和出版社是多对多的关系
#2-------------------下划线查询使用,正向,一对多,多对多查询-------------------
#正向的意思就是你查询从带有多对一,多对多的表查询,这里就从book表查询就是作者或者出版社就是正向查询.
#查询的方式很多种,这这里总结自己的经验就是先把查询语句用中文翻译出来,
#比如现在我想"从book表查询出id=1的书的作者名字"
  #id=1是条件,条件字段是book表中的,所以不涉及到其他表,条件直接写filter(id=1)
  #作者名字是我们想要的结果,作者名字是其他表中的字段,这里就要跨表,所以下下划线就起了作用,values('author__uname'),主表中外键字段名字__字段名字,就可以跨表,代码如下:
models.Book.objects.filter(id=1).values('author__uname') #又比如我想'从book表查询出年龄大于20人的所有书'
#这里年龄大于20的人是条件,而且跨表了,所以filter(author__age__gt=20)
#的所有书是结果,书就在book表中,所以不需要跨表,直接写vlaues('bname')
#代码如下: models.Book.objects.filter(author__age__gt=20).values('bname') #--多对多--正向查询原理一样,如'从book表中查询出清华出版社出版的书的名字'
#代码就是: models.Book.objects.filter(press__pname='清华').values('bname')
#3---------下划线查询使用,反向,一对多,多对多-------------------
#反向与正向相反,这里就是从people表或者press表反向查询书的相关内容,原则和正向查询一样,只是在条件和结果使用下划线的时候变成''表名字__字段名字''
#如"从people表中获取书名为'十万个为什么'"的作者.
#条件'书名十万个为什么'在book表中,跨表了:filter(book__bname='十万个为什么')
#想要的结果是作者,在people表中,不需要使用下划线跨表:values('uname')
#代码: models.People.objects.filter(book__bname='十万个为什么').values("uname")

3:对象查询

#许多时候我们并不能确定说查询到那个字段,而是先用get或者是列表[角标]获取到了对象,再更具具体使用再进行查询,
注意对象只能是一条数据,所以查询的条件对应对象有多个,就要分别用对象查询,麻烦,如果是条件对应多个对象,直接用下划线查询:
#---------------------------------------------------对象,单表,一对多,多对多正向查询------------------
#单表:直接对象.字段获取:
obj=models.People.objects.all()
name=obj[0].uname
#多对一查询'从book表查询到id=1的书的作者:
#由于对象查询对象只能是一个,所以获取id=1的对象:
obj=models.Book.objects.get(id=1)
#再用对象查询到对应的作者:
obj.author.uname#对象.外键字段名字.想要得到的字段名字,其中obj.auther是获取到与obj对象对应的author中的对象,是对象所以可以再次使用.uname #多对多查询
#'从book查询书籍id=1的所有出版社'
obj=models.Book.objects.get(id=1)
obj.press.values('pname') #由于是多对多,obj.press是直接获取到了与id=1的press表中的数据,有可能是多个,所以不再是对象,进行查询就可以用filter(),get(),values()等,区别 与一对多
#----------------对象查询之反向查询---------------------
#反向查询表中没有其他表的字段,会用到对象.表名字_set进入到其他表(也可以在设置models的时候由related_name='xxx'换成xxx_set进入其他表)
#一对多:
#如"得到了id=1的人的对象,想查询他的所有书籍":
obj=models.Press.objects.get(id=1)#获取对象
obj.book_set.values("bname")
#多对多
#如'得到了id=1的出版社,查询该出版社的所有书籍': obj=models.Press.objects.get(id=1)#获取对象
obj.book_set.values("bname")
#变化一下:"得到了id=1的出版社,查询该出版社的所有书籍的作者"
obj=models.Press.objects.get(id=1)#获取对象
obj.book_set.values("people__uname")

4:一对多,多对多数据的增删.

---------------------一对多添加-----------------------

#我们在创建foreignKey字段的时候,默认对应的是其他表的id字段,所以这个字段django在生成的时候会在我们的命名后面加上_id,我们这里的表结构book表中的author生成的字段名字就是author_id,
#方法一:可以直接利用这个名字去创建
models.Book.objects.create(bname='xxx',author_id=1) #方法二:获取到对象再添加:
"现在我们想添加一本书,书名'xx',作者yy''
#作者yy如果已经存在people表中,就直接获取该条数据的对象:
obj=models.People.objects.get(pname=yy"")
#再将该对象与书名xx绑定:
models.Book.objects.create(bname='xxx',author=obj)#这里就直接写自己命名的字段了
----------------------------多对多数据添加删除-------------------------
#多对多其实就是2个一对多,一般我们设置ManytoMany字段,django就帮我们生成了关系表,关系表的字段就是2个一堆多讲2个表连接起来,由于是django帮我们自动生成的第三张表,我们是不能直接操作第三张表的,所以会用到对象的add(),remove()等方法.
如果是自己手动添加的第三张表,就可以用一对多的方法添加 如"添加一本书,出版社是id=1和id=2的出版社"
#首先创建一本书
首先获取到id=1和id=2的出版社
obj=models.Press.objects.filter(id__in=[1,2])#这里是一个列表集合
#获取书对象
bojb=models.Book.objects.create(
bname="xxx",
author_id=1,
)
#正向添加就是:
bobj.press.add(*obj)
#反向添加就是
obj[0].book_set.add(bobj)
obj[1].book_set.add(bobj)

Django_models下划线__正反查询,对象正反查询的更多相关文章

  1. python中有两个下划线__的是内置方法,一个下划线_或者没有下划线的可能是属性,也可能是方法,也可能是类名

    python中有两个下划线__的是内置方法,一个下划线_或者没有下划线的可能是属性,也可能是方法,也可能是类名,如果在类中定义的就是类的私有成员. >>> dir(__builtin ...

  2. Python3 单下划线_双下划线__开头

    Python 中,下划线对解释器有特殊的含义,而且是内建标识符所使用的符号,使用时要多加留意. 在 Python3 的面向对象中,双下划线开头的变量和方法表名为私有变量和私有方法. __private ...

  3. django(七)之数据库表的单表-增删改查QuerySet,双下划线

    https://www.cnblogs.com/haiyan123/p/7738435.html https://www.cnblogs.com/yuanchenqi/articles/6083427 ...

  4. Django ORM字段类型 单表增删改查 万能的双下划线

    1.ORM三种模型 模型之间的三种关系:一对一,一对多,多对多. 一对一:实质就是在主外键(author_id就是foreign key)的关系基础上,给外键加了一个UNIQUE=True的属性: 一 ...

  5. 基于对象的跨表查询,多对多查询,多对多操作,聚合查询和分组查询,F查询和Q 查询

    基于对象的跨表查询 一对多查询(班级表和学生表) 表结构创建 class Class(models.Model): id = models.AutoField(primary_key=True) cn ...

  6. Django框架(九)-- 多表操作:一对一、一对多、多对多的增删改,基于对象/双下划线的跨表查询、聚合查询、分组查询、F查询与Q查询

    一.创建多表模型 一对一:OneToOneField 一对多:ForeignKey 多对多:ManyToManyField 创建表时,会自动添加一个nid字段,并且自增,所以id可以不用手动创建 On ...

  7. Django框架(十)—— 多表操作:一对一、一对多、多对多的增删改,基于对象/双下划线的跨表查询、聚合查询、分组查询、F查询与Q查询

    目录 多表操作:增删改,基于对象/双下划线的跨表查询.聚合查询.分组查询.F查询与Q查询 一.创建多表模型 二.一对多增删改表记录 1.一对多添加记录 2.一对多删除记录 3.一对多修改记录 三.一对 ...

  8. django 神奇的双下划线,通过外键的三种查询方式

    一,用于跨表操作 只要是object后面字符串都是用双下划线__.其它地方用点. 如:的values中的group_code__name.group_code是一个外键 def list(reques ...

  9. 基于双下划线的跨表查询 (join查询)

    因为你的数据库中的查询就是重点  那么你的django提供的orm也是查询语句最重点 ,也提供的查询方法比较的多,下面我们学习下类似于MYSQL的连表(join)查询 Django 还提供了一种直观而 ...

随机推荐

  1. 操作系统口令认证,sysdba本地登录需要输入密码

    开发测试人员,反馈,sqlplus / as sysdba 登陆需要输入密码? 本篇文档流程: 1.场景还原 2.问题处理 3.相关问题介绍 一.场景还原 1)配置SQLNET.ora配置文件,配置操 ...

  2. JavaScript常见的继承方式

    原型链机制: 在ECMAscript中描述了原型链的概念,并将原型链作为实现继承的主要方法,其基本思想就是利用原型让一个引用类型继承另一个引用类型的属性和方法. 构造函数和原型还有实例之间的关系: 每 ...

  3. Linux下安装oracle的步骤和一些问题

    今天在Linux64位系统安装oracle数据库,折腾了一天,终于搞定了,现在把安装步骤梳理下,防止以后忘记:    (以下内容来自http://blog.163.com/junwu_lb/blog/ ...

  4. day01计算机基础

    今日内容 1.计算机初步认识 1.计算机认识 1. 计算机基础 1.1硬件:cpu/内存/硬盘/主板/网卡 1.2操作系统 linux:免费开源 windows mac 1.3解释器/编译器 补充:编 ...

  5. linux下安装mysql解决乱码、时间差、表的大小写问题

    编辑vi /etc/mysql/my.cnf,有的则是:/etc/my.cnf,加入 [client]default-character-set=utf8mb4 [mysql]default-char ...

  6. VUE2中使用mint-ui,日期选择picker

    首先页面引入需要使用的组件 import { DatetimePicker,Toast,Popup,Picker } from 'mint-ui'; methods部分 openPicker () { ...

  7. Win下更新pip出现OSError:[WinError17]与PerrmissionError:[WinError5]及解决

    环境:Win7 64位,python3.6.0 我在准备用pip装东西的时候,在cmd里先更新了一下pip,大概是9.0.1更新到9.0. 尝试更新pip命令: pip install --upgra ...

  8. ubuntu16.04下配置apache2与php

    系统版本:ubuntu16.04 命令均在终端中输入,用浏览器测试 //安装apache2命令 sudo apt install apache2 //测试是否安装成功 浏览器地址栏输入“localho ...

  9. ORACLE的impdp和expdp命令

    使用EXPDP和IMPDP时应该注意的事项: EXP和IMP是客户端工具程序,它们既可以在客户端使用,也可以在服务端使用. EXPDP和IMPDP是服务端的工具程序,他们只能在ORACLE服务端使用, ...

  10. ios下表单post使用gzip模式

    使用afnetworking,服务器参考的这里 ios端,使用自己的序列化类 manager.requestSerializer = [MyHttpRequestSerializer new];[ma ...