http://www.cnblogs.com/liwenzhou/p/8660826.html

下面的代码是在 python console中配置的。 关闭pycharm会消失。

from app01 import models
models.Person.objects.all()
<QuerySet [<Person: 小黑>, <Person: 小黑2>, <Person: 小黑6>]>

在Python脚本中调用Django环境

import os

if __name__ == '__main__':
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "BMS.settings")
import django
django.setup() from app01 import models books = models.Book.objects.all()
print(books)
  1.查询所有人
  ret = models.Person.objects.all()
  print(ret)
  结果:
  <QuerySet [<Person: 小黑>, <Person: 小黑2>, <Person: 小黑6>]>   
  2.get的查询方法
   ret = models.Person.objects.get(id =1)  #id为 不存在的话会报错
   print(ret)
  结果:
   小黑   3.filter查询
  
   ret = models.Person.objects.filter(name ="小黑")
   print(ret)
   结果
   <QuerySet [<Person: 小黑>]>

    为什么会是这个结果因为:

     class Queryset(list):

  4. 查询id大于1的数据

    ret =models.Person.objects.filter(id__gt=1) #如果id等于100 ,不会报错,会返回一个空的QuerySet对象。

   print(ret)
   结果:

    <QuerySet [<Person: 小黑2>, <Person: 小黑6>]>

  5.查询id等于1的数据,并取出里面的数据通过索引的方式取出来
  ret =models.Person.objects.filter(id=1)[0]
  print(ret)
  结果:
  
  小黑
   6.exclude   
  print('exclude'.center(120,'*'))
  ret =models.Person.objects.exclude(id=1)
  print(ret)
  结果
  ********************************************************exclude*********************************************************

   <QuerySet [<Person: 小黑2>, <Person: 小黑6>]>

  7.values(不写字段名,默认查询所有的字段)
  ret = models.Person.objects.values('birthday')
  print(ret)
  结果

   <QuerySet [{'birthday': datetime.date(2018, 5, 10)}, {'birthday': datetime.date(2018, 5, 25)}, {'birthday': datetime.date(2018, 5, 3)}]>

  8.values_list, 返回一个QuerySet对象,里面都是元组,不写字段,会查询所有
  ret = models.Person.objects.values_list('name','birthday')
  print(ret)
  结果

  <QuerySet [('小黑', datetime.date(2018, 5, 10)), ('小黑2', datetime.date(2018, 5, 25)), ('小黑6', datetime.date(2018, 5, 3))]>

  9 .order_by  对查询结果进行排序
  ret = models.Person.objects.all().order_by('birthday')
  print(ret)
  相当于设置元类 在Person类的下面
  
  class meta:
    ordering =(‘birthday’)   结果
  <QuerySet [<Person: 小黑6>, <Person: 小黑>, <Person: 小黑2>]>
   10.reverse 将一个有序的QuerySet进行反转
  
  ret =models.Person.objects.all().order_by('birthday').reverse()
  print(ret)
  结果:

   <QuerySet [<Person: 小黑2>, <Person: 小黑>, <Person: 小黑6>]>

  11. count 返回QuerySet中对象的个数

  
  ret =models.Person.objects.all().count()
  print(ret)
  结果
  3   12. first 返回QuerySet对象中第一个元素
  ret =models.Person.objects.first()
  print(ret)
  结果:
  小黑   13. last 返回QuerySet对象中最后一个元素
  
  ret =models.Person.objects.last()
  print(ret)
  结果:  
  小黑6   14. exist 判断表里面有没有数据
  ret =models.Person.objects.exists()#Person表中含有数据 返回True ,如果是空白则为False
  print(ret)
  结果:
  True ,


 二 、单表的双下划线查询

1. 查询id值大于1 小于4的结果.
ret = models.Person.objects.filter(id__gt=,id__lt=)

print(ret)

结果

<QuerySet [<Person: 小黑2>, <Person: 小黑6>]>


2. IN 操作查询id在【1,3,5,6】
ret = models.Person.objects.filter(id__in=[1,3,5,6])
print(ret)
结果:

<QuerySet [<Person: 小黑>, <Person: 小黑6>]>

3. exclude 排除在这些id的条目
ret = models.Person.objects.exclude(id__in=[1,3,5,6])
print(ret) 结果:

<QuerySet [<Person: 小黑2>]>

4.  name_contains=  (name__icontains 忽略大小写)
ret =models.Person.objects.filter(name__contains="6")
print(ret)
输出结果:

<QuerySet [<Person: 小黑6>]>

5. id_range =
ret =models.Person.objects.filter(id__range=[1,2]) #相当于sql语句的between 1 and 2
print(ret)
结果:

<QuerySet [<Person: 小黑>, <Person: 小黑2>]>

  6. 日期和时间字段还可以有以下写法

ret =models.Person.objects.filter(birthday__year=2018)
print(ret)
ret =models.Person.objects.filter(birthday__month=5)
print(ret) 结果:

<QuerySet [<Person: 小黑>, <Person: 小黑2>, <Person: 小黑6>]>
<QuerySet [<Person: 小黑>, <Person: 小黑2>, <Person: 小黑6>]>

 

 三、正向查询

# 外键的查询操作
# 正向查询 方法一、
#基于对象 跨表查询
book_obj =models.Book.objects.all().first()
ret = book_obj.publisher #出版社对象
print(ret,type(ret))
ret=book_obj.publisher.name
print(ret,type(ret)) # 和我这本书关联的出版社对象. 结果:

  这是沙河第一出版社对象 <class 'app01.models.Publisher'>
  沙河第一出版社 <class 'str'>

正向查询方法二、
# 查询id是1的书的出版社的名称.
#双下划线就表示跨了一张表.
book_obj=models.Book.objects.filter(id=1).values('publisher__name')
print(ret)
结果:

 沙河第一出版社


 四、反向查询

# # 反向查询。用set关键字  (基于对象 查询)
publisher_obj =models.Publisher.objects.first()
# ret =publisher_obj.book_set.all()
# print(ret) # #另外一种写法 (基于双下滑线)
ret =publisher_obj.books.all() #books 为在Book类里设置的related_name 关键字的值
print(ret) 结果:
<QuerySet [<Book: 跟老男孩学linux>, <Book: java>]> related_name ='books' 反向查询是用来代替book_set的 根据双下划线 ret =modules.Publisher.objects.filter(id=1).value_list('ooxx__tile') #related_query_name ='ooxx'

  

五、多对多查询. ManytoManyField 

# 多对多 .create
author_obj = models.Author.objects.first()
print(author_obj.name)
#查询小黑1 写过的书
ret =author_obj.books.all()
print(ret) # . create
# 通过作者创建一本书,会自动保存,
# 做了两件事
# 。在book表里创建一本新书,.在作者和书的关系表里添加关联
author_obj.books.create(title ='金老板自传',publisher_id = ) 结果会在book表和book author关系表里自动添加数据。

add

# .add
book_boj =models.Book.objects.get(id =)
author_obj.books.add(book_boj ) # 添加多个
book_objs =models.Book.objects.filter(id__gt=)
author_obj.books.add(*book_objs) #要把列表打算再传进去.
#直接添加id
author_obj.books.add()

remove

# remove 从金老板关联的书里吧开船删掉
# book_obj=models.Book.objects.get(title='gen金老板学开船')
# author_obj.books.remove(book_obj) book_obj =models.Book.objects.get(title="java")
print(book_obj)
author_obj.books.remove(book_obj)

day 69 ORM 多表增删改查操作的更多相关文章

  1. ORM多表增删改查

    一 创建多表 在models.py里创建4张表:Author(作者).AuthorDetail(作者详细信息).Publish(出版社).Book(书) 四张表关系为: (1)首先创建一对一关系.On ...

  2. JAVA 操作远程mysql数据库实现单表增删改查操作

    package MysqlTest; import java.sql.DriverManager; import java.sql.ResultSet; import com.mysql.jdbc.C ...

  3. Django项目的创建与介绍.应用的创建与介绍.启动项目.pycharm创建启动项目.生命周期.三件套.静态文件.请求及数据.配置Mysql完成数据迁移.单表ORM记录的增删改查

    一.Django项目的创建与介绍 ''' 安装Django #在cmd中输入pip3 #出现这个错误Fatal error in launcher: Unable to create process ...

  4. ORM之单表增删改查

    ORM之单表增删改查 在函数前,先导入要操作的数据库表模块,model from model所在的路径文件夹 import model   在views文件中,加的路径: #就一个app01功能的文件 ...

  5. GZFramwork数据库层《三》普通主从表增删改查

    运行结果: 使用代码生成器(GZCodeGenerate)生成tb_Cusomer和tb_CusomerDetail的Model 生成器源代码下载地址: https://github.com/Gars ...

  6. GZFramwork数据库层《一》普通表增删改查

    运行结果:     使用代码生成器(GZCodeGenerate)生成tb_MyUser的Model 生成器源代码下载地址: https://github.com/GarsonZhang/GZCode ...

  7. Django框架(八)--单表增删改查,在Python脚本中调用Django环境

    一.数据库连接配置 如果连接的是pycharm默认的Sqlite,不用改动,使用默认配置即可 如果连接mysql,需要在配置文件中的setting中进行配置: 将DATABASES={} 更新为 DA ...

  8. Django框架(九)—— 单表增删改查,在Python脚本中调用Django环境

    目录 单表增删改查,在Python脚本中调用Django环境 一.数据库连接配置 二.orm创建表和字段 三.单表增删改查 1.增加数据 2.删除数据 3.修改数据 4.查询数据 四.在Python脚 ...

  9. 48.Python中ORM模型实现mysql数据库基本的增删改查操作

    首先需要配置settings.py文件中的DATABASES与数据库的连接信息, DATABASES = { 'default': { 'ENGINE': 'django.db.backends.my ...

随机推荐

  1. WebMagic写的网络爬虫

    一.前言 最近因为有爬一些招聘网站的招聘信息的需要,而我之前也只是知道有“网络爬虫”这个神奇的名词,具体是什么.用什么实现.什么原理.如何实现比较好都不清楚,因此最近大致研究了一下,当然,研究的并不是 ...

  2. Hadoop 系列(一)基本概念

    Hadoop 系列(一)基本概念 一.Hadoop 简介 Hadoop 是一个由 Apache 基金会所开发的分布式系统基础架构,它可以使用户在不了解分布式底层细节的情況下开发分布式程序,充分利用集群 ...

  3. 官网类原型模板分享——Apple

    苹果公司是美国一家高科技公司,引领全球数码产品设计潮流,是世界最具价值的品牌. 此原型正是取自苹果公司官网,网站主要以展示产品为主,排版方式采用大图配简练的文字,清爽简洁的同时突出产品优势,增大产品的 ...

  4. 《JavaScript高级程序设计》笔记

    1. 当在函数内部定义了其他函数时,就创建了闭包.闭包有权访问包含函数内部的所有变量. 2. 闭包可以分隔变量空间,不会占用全局空间而造成相互间的干拢.使用闭包可以在JavaScript中模仿块级作用 ...

  5. 2018.10.23 NOIP模拟 行星通道计划(bit)

    传送门 卡常题. 成功卡掉了作死写树套树的zxy. 然而对我的二维bit无能为力. 直接维护两棵bit. bit1[i][j]bit1[i][j]bit1[i][j]表示左端点小于等于iii,右端点小 ...

  6. 2018.09.23 关键网线(tarjan)

    描述 给出一个无向连通图,即在任一个点对间存在路径.有的点提供服务a, 有的点提供服务b .同一个点可能有两种服务类型.每个点必须与提供2种服务的点连通.如果一个边断掉,就可能出现有些点不能被服务到, ...

  7. 2018.08.31 bzoj1426 收集邮票(期望dp)

    描述 有n种不同的邮票,皮皮想收集所有种类的邮票.唯一的收集方法是到同学凡凡那里购买,每次只能买一张,并且 买到的邮票究竟是n种邮票中的哪一种是等概率的,概率均为1/n.但是由于凡凡也很喜欢邮票,所以 ...

  8. arduino uno r3 + SIM900 + USB打火机 实现电话触发点火

    需求来源 1.儿子过完年6岁,喜欢玩烟花,但是胆子小,于是我就负责点火,从年前26到大年初八,每天晚上要给儿子点鞭炮啊点鞭炮. 2.这边过年要打关门炮跟开门炮,大年初一凌晨还要起来帮老妈点鞭炮,说实在 ...

  9. CentOS里vim基本操作

    1.关于退出 :wq!  ----强制保存退出 :wq  ---- 保存退出 :x   ----- 作用和:wq 一样 ZZ  ---- 作用和:wq一样,(注意Z是大写的,并且不是在命令模式) :q ...

  10. svn 创建tag

    1. 右键项目(源) 2. 选择复制到哪个路径(创建文件夹选项) 3. 选择哪个版本(源的) 4. 填写备注 5. 结束 使用:import  .合并等