一般操作

常用的13个操作

<1> all():                 查询所有结果

<2> filter(**kwargs):      它包含了与所给筛选条件相匹配的对象

<3> get(**kwargs):         返回与所给筛选条件相匹配的对象,返回结果有且只有一个,如果符合筛选条件的对象超过一个或者没有都会抛出错误。

<4> exclude(**kwargs):     它包含了与所给筛选条件不匹配的对象

<5> values(*field):        返回一个ValueQuerySet——一个特殊的QuerySet,运行后得到的并不是一系列model的实例化对象,而是一个可迭代的字典序列

<6> values_list(*field):   它与values()非常相似,它返回的是一个元组序列,values返回的是一个字典序列

<7> order_by(*field):      对查询结果排序

<8> reverse():             对查询结果反向排序,请注意reverse()通常只能在具有已定义顺序的QuerySet上调用(在model类的Meta中指定ordering或调用order_by()方法)。

<9> distinct():            从返回结果中剔除重复纪录(如果你查询跨越多个表,可能在计算QuerySet时得到重复的结果。此时可以使用distinct(),注意只有在PostgreSQL中支持按字段去重。)

<10> count():              返回数据库中匹配查询(QuerySet)的对象数量。

<11> first():              返回第一条记录

<12> last():               返回最后一条记录

<13> exists():             如果QuerySet包含数据,就返回True,否则返回False

返回QuerySet对象的方法有

all()

filter()

exclude()

order_by()

reverse()

distinct()

特殊的QuerySet

values()         返回一个可迭代的字典序列

values_list()    返回一个可迭代的元祖序列

返回具体的对象

get()
first()
last()

返回布尔值

exists()

返回数字

count()

单表查询常用操作

gt - Greater than

大于

例:

models.Person.objects.filter(id__gt=4)    # 获取id大于4的值

对应的SQL语句:

SELECT ... WHERE id > 4;

gte - Greater than or equal to

大于或等于

lt - Less than

小于

lte - Less than or equal to

小于或等于

例: 获得id大于2且小于5的值

models.Person.objects.filter(id__gt=2, id__lt=5)

in

给定的是可迭代的, 通常是列表, 元组或者queryset.

例:

models.Person.objects.filter(id__in=[1, 3])    # 获取id等于1, 3的数据

对应的SQL语句:

SELECT ... WHERE id IN (1, 3);

contains

区分大小写

例:

models.Person.objects.filter(name__contains='a')    # 获取name字段中包含"a"的数据

对应的SQL语句:

SELECT ... WHERE name LIKE '%a%';

icontains

不区分大小写

例:

models.Person.objects.filter(name__contains='a')    # 获取name字段中包含"a"或者"A"的数据

对应的SQL语句:

SELECT ... WHERE name ILIKE '%a%';

range

包括两边的边界值

例:

models.Person.objects.filter(id__range=[1, 3])    # id范围是1到3

对应的SQL语句:

SELECT ... WHERE id BETWEEN 1 and 3;

startswith

以...开头, 区分大小写

例:

models.Person.objects.filter(name__startswith='a')

对应的SQL语句:

SELECT ... WHERE name LIKE 'a%';

类似的:

istartswith

以...开头, 不区分大小写

endswith

以...结尾, 区分大小写

iendswith

以...结尾, 不区分大小写


year

例:

models.Person.objects.filter(birth__year=2019)

对应的SQL语句:

SELECT ... WHERE birth BETWEEN '2019-01-01' AND '2019-12-31';

ForeignKey操作

正向查找

对象查找(跨表)

语法:

对象.关联字段.字段

例:

book_obj = models.Book.objects.first()  # 第一本书对象
print(book_obj.press) # 得到这本书关联的出版社对象
print(book_obj.press.name) # 得到出版社对象的名称

字段查找(跨表)

语法:

关联字段__字段

例:

print(models.Book.objects.values('press__name'))
obj = models.Book.objects.filter(press__name='xx出版社')
print(obj)

反向查找

对象查找

语法:

默认:
obj.表名_set 表名_set可以自己命名

例:

press_obj = models.Press.objects.first()    # 找到第一个出版社对象
books = press_obj.books.all() # 找到第一个出版社出版的所有书
titles = books.values_list('title') # 找到第一个出版社出版的所有书的书名
print(books)
print(titles)

字段查找

语法:

表名__字段

例:

titles = models.Press.objects.values_list('books__title')
# books__title中的books是自己在models.py中, related_name='books'
# 具体的代码:
class Book(models.Model):
title = models.CharField(max_length=32)
press = models.ForeignKey(to='Press', on_delete=models.CASCADE, related_name='books')

ManyToManyField

class RelatedManager

"关联管理器"是在一对多或者多对多的关联上下文中使用的管理器。

它存在于下面两种情况:

  1. 外键关系的反向查询
  2. 多对多关联关系

简单来说就是当 点 后面的对象 可能存在多个的时候就可以使用以下的方法。

方法

create()

创建一个新的对象,保存对象,并将它添加到关联对象集之中,返回新创建的对象。

obj = models.Author.objects.first()
obj.books.create(title='一起来学MATLAB', press_id=2)

add()

把指定的model对象添加到关联对象集中。

添加对象

obj = models.Author.objects.first()
obj.books.add(*models.Book.objects.all())

添加id

obj = models.Author.objects.first()
obj.books.add(*[3, 4])

set()

更新model对象的关联对象

obj = models.Author.objects.first()
obj.books.set([1, 2])

remove()

从关联对象集中移除执行的model对象

obj = models.Author.objects.first()
obj.books.remove(1)

clear()

从关联对象集中移除一切对象

obj = models.Author.objects.first()
obj.books.clear()

注意:

对于ForeignKey对象,clear() 和 remove() 方法仅在 null=True 时存在。

详情见 Django官方文档

Django之ORM相关操作的更多相关文章

  1. Django框架详细介绍---ORM相关操作

    Django ORM相关操作 官方文档: https://docs.djangoproject.com/en/2.0/ref/models/querysets/ 1.必须掌握的十三个方法 <1& ...

  2. Django【第5篇】:Django之ORM数据库操作

    django之ORM数据库操作 一.ORM介绍 映射关系: 表名 -------------------->类名 字段-------------------->属性 表记录-------- ...

  3. Django中的ORM相关操作:F查询,Q查询,事物,ORM执行原生SQL

    一    F查询与Q查询: 1 . F查询: 在上面所有的例子中,我们构造的过滤器都只是将字段值与某个常量做比较.如果我们要对两个字段的值做比较,那该怎么做呢? Django 提供 F() 来做这样的 ...

  4. Django models ORM基础操作--白话聊Django系列

    上次我们讲完了views视图,那我们这次来看一下Django强大的ORM,可以这么说,你不懂Django的ORM,你就不懂Django,那废话不多说 ORM又称关系对象映射,在ORM里,一张表就是一个 ...

  5. Django之ORM表操作

    ORM表操作 1.ORM单表操作 首先想操作表的增删改查,需要先导入这个表,以之前创建的UserInfo表为例,在app下的views.py中导入 from app import models def ...

  6. Django学习笔记之Django ORM相关操作

    一般操作 详细请参考官方文档 必知必会13条 <> all(): 查询所有结果 <> filter(**kwargs): 它包含了与所给筛选条件相匹配的对象 <> ...

  7. Django框架详细介绍---ORM相关操作---select_related和prefetch_related函数对 QuerySet 查询的优化

    Django的 select_related 和 prefetch_related 函数对 QuerySet 查询的优化 引言 在数据库存在外键的其情况下,使用select_related()和pre ...

  8. Django框架——基础之模型系统(ORM相关操作)

    ------------恢复内容开始------------ 1.必定会的十三条! 1.1记忆方法一:(按字母顺序记忆)   <1> all(): 查询所有结果 <2> cou ...

  9. Django框架(八) Django之ORM数据库操作

    创建模型 实例:我们来假定下面这些概念,字段和关系 作者模型:一个作者有姓名和年龄. 作者详细模型:把作者的详情放到详情表,包含生日,手机号,家庭住址等信息.作者详情模型和作者模型之间是一对一的关系( ...

随机推荐

  1. python3编程基础之一:注释模块和包

    1.注释 python中的注释和其他任何编程语言中的注释都不一样,有的注释有特殊要求,而是还是有用的. 1).单行注释:注释以#开始到语句结尾,#号后一般跟一个空格 2).多行注释:文档注释,以&qu ...

  2. "error":"bucket is protected"

    这个是我做图片上传的时候,后台返回了图片,把图片链接放到浏览器 其实是因为后台配置了,图片必须以 结尾.就是压缩的图,所以其他格式结尾的是不会显示的哈

  3. vue的ui组件库

    https://www.cnblogs.com/dupd/p/7735450.html

  4. Pandas的Categorical Data

    http://liao.cpython.org/pandas15/ Docs » Pandas的Categorical Data类型 15. Pandas的Categorical Data panda ...

  5. 上传图片获取base64编码、本地预览

    一.读取文件的对象 — new FileReader()   上传图片接口参数有图片base64编码(数组, imgBase64List ),主要用到 读取文件的对象 [ new FileReader ...

  6. 2019-8-15C#MDI窗体实现多窗口效果

    C#MDI窗体实现多窗口效果  Visual C#是微软公司推出的下一代主流程序开发语言,他也是一种功能十分强大的程序设计语言,正在受到越来越多的编程人员的喜欢.在Visual C#中,提供了为实现M ...

  7. 原创 linux 爬虫拨号服务器完整设置

    [root@cloud ~]# cat /home/bh.sh #!/bin/bash PATH=/sbin:/bin:/usr/sbin:/usr/bin:/sbin/ifconfig /usr/s ...

  8. 关于Mysql-unknow-column-in-where-clause

    写在前边: 已经很久不更新了啊,整个2月份几乎没有遇到什么新鲜事.直到昨天我又犯了一次傻,貌似只有我犯傻的时候才有材料可以跟大家分享- 问题表现: mysql 报错: unknow column 's ...

  9. python模块之request模块的理解

    首先还是老生长谈,说说定义和作用,request模块是一个用于访问网络的模块,其实类似的模块还有很多,不在一一在这里解释.这么多的相似的模块为什么都说只有这个好用呢.因为他人性化.如果你学过urlli ...

  10. 简易的CRM系统案例之Servlet+Jsp+MySQL版本

    数据库配置 datebase.properties driver=com.mysql.jdbc.Driver url=jdbc:mysql://127.0.0.1:3306/infos usernam ...