Django_models下划线__正反查询,对象正反查询
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下划线__正反查询,对象正反查询的更多相关文章
- python中有两个下划线__的是内置方法,一个下划线_或者没有下划线的可能是属性,也可能是方法,也可能是类名
python中有两个下划线__的是内置方法,一个下划线_或者没有下划线的可能是属性,也可能是方法,也可能是类名,如果在类中定义的就是类的私有成员. >>> dir(__builtin ...
- Python3 单下划线_双下划线__开头
Python 中,下划线对解释器有特殊的含义,而且是内建标识符所使用的符号,使用时要多加留意. 在 Python3 的面向对象中,双下划线开头的变量和方法表名为私有变量和私有方法. __private ...
- django(七)之数据库表的单表-增删改查QuerySet,双下划线
https://www.cnblogs.com/haiyan123/p/7738435.html https://www.cnblogs.com/yuanchenqi/articles/6083427 ...
- Django ORM字段类型 单表增删改查 万能的双下划线
1.ORM三种模型 模型之间的三种关系:一对一,一对多,多对多. 一对一:实质就是在主外键(author_id就是foreign key)的关系基础上,给外键加了一个UNIQUE=True的属性: 一 ...
- 基于对象的跨表查询,多对多查询,多对多操作,聚合查询和分组查询,F查询和Q 查询
基于对象的跨表查询 一对多查询(班级表和学生表) 表结构创建 class Class(models.Model): id = models.AutoField(primary_key=True) cn ...
- Django框架(九)-- 多表操作:一对一、一对多、多对多的增删改,基于对象/双下划线的跨表查询、聚合查询、分组查询、F查询与Q查询
一.创建多表模型 一对一:OneToOneField 一对多:ForeignKey 多对多:ManyToManyField 创建表时,会自动添加一个nid字段,并且自增,所以id可以不用手动创建 On ...
- Django框架(十)—— 多表操作:一对一、一对多、多对多的增删改,基于对象/双下划线的跨表查询、聚合查询、分组查询、F查询与Q查询
目录 多表操作:增删改,基于对象/双下划线的跨表查询.聚合查询.分组查询.F查询与Q查询 一.创建多表模型 二.一对多增删改表记录 1.一对多添加记录 2.一对多删除记录 3.一对多修改记录 三.一对 ...
- django 神奇的双下划线,通过外键的三种查询方式
一,用于跨表操作 只要是object后面字符串都是用双下划线__.其它地方用点. 如:的values中的group_code__name.group_code是一个外键 def list(reques ...
- 基于双下划线的跨表查询 (join查询)
因为你的数据库中的查询就是重点 那么你的django提供的orm也是查询语句最重点 ,也提供的查询方法比较的多,下面我们学习下类似于MYSQL的连表(join)查询 Django 还提供了一种直观而 ...
随机推荐
- Mac + PyCharm 安装 Opencv3 + python2.7
本文地址:http://www.cnblogs.com/QingHuan/p/7354074.html 转载请注明本文地址,方便读者查看本文更新,谢谢! 今天要在Mac上安装OpenCV,过程非常曲折 ...
- Centos6.5修改镜像为国内的阿里云源
第一步:备份你的原镜像文件,以免出错后可以恢复. mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.back ...
- js基础概念-操作符
操作符是操作数据值的符号,也叫做运算符. 按照操作个数分为:一元运算符,二元运算符,三元运算符. 按功能分为:位操作符,布尔操作符,乘性操作符,加性操作符,关系操作符,关系操作符,相等操作符,条件操作 ...
- Markdown使用方法
目录 Markdown 简明语法手册 1. 斜体和粗体 2. 分级标题 这是一个一级标题 这是一个二级标题 这是一个三级标题 3. 外链接 4. 无序列表 5. 有序列表 6. 文字引用 7. 行内代 ...
- pandas Dataframe 取某行
In [1]: df = DataFrame(randn(5,2),index=range(0,10,2),columns=list('AB')) In [2]: df Out[2]: A B 0 1 ...
- PythonStudy——函数的导入 Import of functions
# 函数:完成 特定 功能的代码块,作为一个整体,对其进行特定的命名,该名字就代表函数# 难点:如何定义个函数 # 现实中很多问题要通过一些工具进行处理 => 可以将工具提前生产出来并命名# = ...
- Linux中“零拷贝”
服务器响应一个http请求的步骤 把磁盘文件读入内核缓冲区 从内核缓冲区读到内存 处理(静态资源不需处理) 发送到网卡的内核缓冲区(发送缓存) 网卡发送数据 数据从第一步中的内核缓冲区到第四步的内核缓 ...
- DataTable.Select 处理关联表数据
DataSet.Clone 会拷贝表结构,关联关系也会拷贝, 用Select 筛选后ImportRow 导入新的DataTable,然后处理关联DataTable DataSet ds2 = dsS ...
- for批处理skip参数不支持变量延迟!n!的解决办法
a.txt 文件a第1行 文件a第2行 文件a第3行 b.txt 文件b第1行 文件b第2行 文件b第3行 合并ab .bat @echo off REM 把两个文件逐行合并成一列 set n=0 f ...
- springboot+mockito 异常解决方案
系统启动的异常日志如下 javax.net.ssl.* java.lang.IllegalStateException: Failed to load ApplicationContext at or ...