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. java.net.BindException: Address already in use: JVM_Bind:80 异常的解决办法

    今天遇见了这个端口被占用问题 然后各种百度 先是说 用命令 netstat -a -n -o 最后一个选项表示连接所在进程id. 找到8080端口的PID然后打开任务管理器, 切换到进程选项卡, 在菜 ...

  2. SQL-记录查询篇-009

    在学习记录查询之前,学习一些关键字的使用: 1.逻辑运算符:and . or . not  .is null select * from   table_name where  id>2 and ...

  3. python 进程之间的数据共享

    from multiprocessing import Process,Manager import os def f(d,n): d[os.getpid()] = os.getppid()#对字典d ...

  4. 互联网媒体类型 MIME Type

    参考:https://zh.wikipedia.org/wiki/%E4%BA%92%E8%81%94%E7%BD%91%E5%AA%92%E4%BD%93%E7%B1%BB%E5%9E%8B 互联网 ...

  5. 内存或磁盘空间不足 Microsoft Excel无法再次打开解决方法

    在网络上下载的文件,使用EXCEL打开的时候提示“内存或磁盘空间不足,Microsoft Excel 无法再次打开或保存任何文档.”,针对这个问题,装机之家小编特地在网上搜罗了具体解决方法,但是网上提 ...

  6. (C#)中的DataSet、string、DataTable等对象转换成Json

    ConvertJson.cs类 using System; using System.Collections.Generic; using System.Text; using System.Data ...

  7. koa2+log4js+sequelize搭建的nodejs服务

    主要参考http://www.jianshu.com/p/6b816c609669这篇文章 npm安装使用国内taobao镜像,速度更快些 npm --registry https://registr ...

  8. 【剑指offer】求树中满足和为给定数字的路径

    题目: 输入一颗二叉树的跟节点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径.路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径.(注意: 在返回值的list中,数组长度大的 ...

  9. IIS 7.0的集成模式和经典模式

    IIS7.0中的Web应用程序有两种配置模式:经典模式和集成模式.经典模式是为了与之前的版本兼容,使用ISAPI扩展来调用ASP.NET运行库, 原先运行于IIS6.0下的Web应用程序迁移到IIS7 ...

  10. jQuery解决IE6/7/8不能使用 JSON.stringify 函数的问题

    原文地址:http://www.ynpxrz.com/n1445665c2023.aspx JSON 对象是在 ECMAScript 第 5 版中实现的,此版于 2009 年 12 月发布:IE6 I ...