Django的Manager和QuerySet 要从数据库检索对象,需要通过模型类的 Manager 构建一个 QuerySet。...换言之,models,manager和queryset是我们和数据库交互必须的三个东西。...在Django中,模型的Manager提供了接口,它赋予了 Django 模型操作数据库的能力。默认情况下,Django 为每个模型类添加了一个名为 objects 的 Manager。...要为指定类重命名 Manager,在该模型中定义一个类型为 models.Manager 的属性。...下面介绍一下常用的可以返回QuerySet对象的QuerySet方法 不能返回QuerySet对象的QuerySet方法 下面介绍一些常用的不能返回QuerySet对象的QuerySet方法。
一、QuerySet 查询集,类似一个列表,包含了满足查询条件的所有项。QuerySet 可以被构造,过滤,切片,做为参数传递,这些行为都不会对数据库进行操作。只有你查询的时候才真正的操作数据库。...意味着QuerySet是惰性执行的----即创建查询集不会带来任何的数据库访问,直到查询集需要求值的时候,Django才会真正运行这个查询。... exclude(**kwargs): 它包含了与所给筛选条件不匹配的对象 values(*field): 返回一个ValueQuerySet——一个特殊的QuerySet... distinct(): 从返回结果中剔除重复纪录(如果你查询跨越多个表,可能在计算QuerySet时得到重复的结果。... count(): 返回数据库中匹配查询(QuerySet)的对象数量。
查询集 QuerySet 查询集,也称查询结果集、QuerySet,表示从数据库中获取的对象集合。...当调用如下过滤器方法时,Django会返回查询集(而不是简单的列表): all():返回所有数据。 filter():返回满足条件的数据。 exclude():返回满足条件之外的数据。...会把结果缓存下来,再次使用这个查询集时会使用缓存的数据,减少了数据库的查询次数。...和offset子句。...注意:不支持负数索引。
>>> from django.contrib.auth.models import User >>> User.objects.none() QuerySet []> 以上就是本文的全部内容,如果觉得还不错的话
其实就是查询的意思。 所以,queryset 是什么?是查询结果的集合的意思。 我就不用那些标准的百度百科的回答了,咱直接上代码,从数据直接拿出来的数据来当例子,你就明白了。...我们用数据工厂平台的代码做演示,目前的models.py中的超链接表,存放数据为这样的,有俩个字段: 如图,俩个字段分别是link_name和link_url。...好然后我们用一段函数来把数据从中取出来并打印: 结果如下: 可以看到,直接从数据库用.all 或者.filter方法拿出来的 结果是queryset,也就是查询集合。...所以queryset的另一个特性就是可以像列表一样遍历和用下标定位具体内部元素: 遍历的具体子元素,都是一个个货真价实的数据记录哈。 别看我直接输出,就显示一个link_name的值。...此时我们得到的仍然是queryset,但结果中,却显示了所有字段。 这样我们用起来就更方便。为什么这么说呢? 因为我们可以把它外面再加上list() 变成我们python常用的格式了。
一般情况下,我们在写Django项目需要操作QuerySet时一些常用的方法已经满足我们日常大多数需求,比如get、filter、exclude、delete神马的感觉就已经无所不能了,但随着项目但业务逻辑越来越复杂...就是你读出queryset可能会需要一些额外数据要添加进去的时候,你就可以用这个东东咯,使用方法看代码: >>> q = Blog.objects.annotate(Count('entry')) #...,annotate返回的是一个包含注解值的queryset,而aggregate则单独返回注解值,返回类型是一个dict,当然,这种方式在文档中叫做聚合查询,具体使用如下: >>> q = Blog.objects.aggregate...7、latest(field_name=None) 和 earliest(field_name=None) 分别返回指定字段的最新数据与最早数据。...8、first() 和 last() 分别返回queryset的第一项与最后一项,具体用法如下: p = Blog.objects.order_by('title').first() 等同于: try:
Django的queryset是惰性的 Django的queryset对应于数据库的若干记录(row),通过可选的查询来过滤。...这些model会保存在queryset内置的cache中,这样如果你再次遍历这个queryset,你不需要重复运行通用的查询。...如果查询集很大的话,if 语句是个问题 如前所述,查询集缓存对于组合 if 语句和 for 语句是很强大的,它允许在一个查询集上进行有条件的循环。然而对于很大的查询集,则不适合使用查询集缓存。...最简单的解决方案是结合使用exists()和iterator(), 通过使用两次数据库查询来避免使用查询集缓存。...使用exists()和iterator()方法可以优化程序对内存的使用。不过,由于它们并不会生成queryset cache,可能会造成额外的数据库查询。
就是生成 model 目录的 xxx.go 和 xxx_gen.go 文件 使用的工具: 快速生成 model:gentool 根据 model 生成 queryset:go-queryset 下面是详细操作步骤...概述 Golang 操作数据库表时,可能经常需要创建像下图中所示的与数据表相对应的 struct 对象,常被称为 model,有同学可能会说,model 也没几个字段,手写不就好了,没必要用工具来生成。...所以这里介绍一个能快速生成 model 文件和 queryset 的方法。...' 结尾的文件,生成 queryset 文件前,需要在 model 文件中添加 2 行注释,虽然是注释,但是这两行注释必不可少。...student.go 是当前model 文件的文件名,student_gen.go 是将要生成的 queryset 文件的文件名 //go:generate goqueryset -in student.go
QuerySet QuerySet本身可以在不访问数据库的情况下构造、过滤、切片或复制和分配。只需要在需要从数据库检索数据或将数据保存到数据库时访问数据库。...对执行的QuerySet进行切片也会返回一个列表。...如果只想提取将来从数据库中重新创建QuerySet所需的信息,请提取QuerySet的查询属性。...QuerySet类具有以下公共属性,可用于内省: 有序 True如果QuerySet是有序的–有一个order_by()子句或模型的默认排序。否则,这是错误的。...使用关键字参数指定的注释使用关键字作为注释的别名。匿名参数将根据聚合函数的名称和聚合模型字段为其生成别名。只有引用单个字段的聚合表达式才能成为匿名参数。其他所有内容都必须是关键字参数。
的模型字段类型>>> https://docs.djangoproject.com/en/2.1/ref/models/fields/#field-types InterField CharFiled... 模型类上的管理器(class.objects) queryset (惰性,,没有操作数据库)表示数据库中对象的集合,等同于select 语句 query 获取mysql 语句 first()...) 根据给定的条件获取过滤后的queryset,多个条件用','连接 exclude(**kwargs) 作用和filter相反,去除不符合条件的对象 多条件的or连接 from django.db.models...) 与values差不多,返回queryset,‘对象列表’,必须带上主键 defer(*field) 和only功能相反,用法一样,返回一个queryset,对象列表,排除 排序 order_by...(*fields) 根据给定的字段来排序 如果要反序就在field前加'-' 切片 和python切片用法相似,不支持复索引,数据大的时候不用步长 ***切片后不再支持附加条件与排序 *多字段排序有什么用
Django Form类定义中有一个 ModelChoiceField 对应的是Model 的外键,queryset 是返回一个查询集对象 例如,我有一个Form class BookForm(forms.Form...): books = forms.ModelChoiceField(queryset=Books.objects.all()) 这似乎并没有什么问题。...但是我想要传递books的id,就出现了问题。我们可以如下解决。...在视图中修改queryset对象 form = BookForm() form.fields['books'].queryset = Books.objects.filter(id=1).all() 如果要设置默认值可以通过...{initial={'id':1}的方法进行。
类型的数据来调用,对查询结果排序,默认是按照id来升序排列的,返回值还是queryset类型。...空的queryset类型数据也有布尔值True和False,但是一般不用它来判断数据库里面是不是有数据,如果有大量的数据,你用它来判断,那么就需要查询出所有的数据,效率太差了,用count或者exits...model的实例化对象,而是一个可迭代的字典序列,只要是返回的queryset类型,就可以继续链式调用queryset类型的其他的查找方法,其他方法也是一样的。...values_list(*field) 它与values()非常相似,它返回的是一个元组序列,values返回的是一个字典序列 distinct() values和values_list得到的queryset...values_list 以元组方式返回 QuerySet dic distinct 去重 values和values_list得到的queryset类型 queryset 模糊查询 Book.objects.filter
一般而言,当对一个没有求值的QuerySet进行的运算,返回的是QuerySet、ValuesQuerySet、ValuesListQuerySet、Model实例时,一般不会立即查询数据库;反之,当返回的不是这些类型时...由于有些数据库,如Sqlite不支持delete与limit连用,所以在这些数据库对QuerySet的切片执行delete()会出错。...由于有些数据库,不支持update与limit连用,所以在这些数据库对QuerySet的切片执行update()会出错。...而values_list()跟values()相似,它返回的是一个ValuesListQuerySet,也类型于一个列表,不过它的元素不是字典,而是元组。...WHERE pub_date IS NULL; 2.4.18 QuerySet切片——对应于limit QuerySet的索引只能是非负整数,不支持负整数,所以QuerySet[-1]错误 a
django中配置mysql数据库 查询queryset时如果需要选取查询集中的某个子集的字段时, 应该用切片,或者first 选择某个子集对象,这样才能够使用到 子集的字段,直接queryset后选择字段会直接报错...从数据库中查询出来的结果一般是一个QuerySet集合。...列表里的元素是字典,而不是queryset对象列表。...school和teacher表里并没有写,但是他们可以通过反向关联,查找到对应的student: >>> School.objects.get(school_name='北大').student_set...表 s = Student.objects.all() # 操作数据库 print(s) 结果: QuerySet [, , <Student:
简而言之: drf找不到删除的数据,admin需要全部数据 drf和admin删除数据都是软删除 解决方案 DRF Django Manager 赋予了 Django的模型(Model)中操作数据库的能力...class ModelManager(models.Manager): # 重写get_queryset方法 def get_queryset(self): # 查询出所有的数据...,但是不包括软删除的数据 return super().get_queryset().filter(is_deleted=False) 这样,最简单的自定义模型Manager就完成了。...,发现get_queryset方法是执行获取查询的,那么把它重写了。...): def get_queryset(self, request): return Book.objects_all.all() 剩下最后一个问题,在admin后台执行删除的时候
2 连接数据库 首先打开 PyCharm 软件,点击 PyCharm 的右侧名为 Database 的选项。这时会弹出操作数据库的可视化界面。...每个模型都有一些类变量,在模型中每个类变量都代表了数据库中的一个字段。 每个字段通过 Field 类的一个实例表示 —— 例如字符字段 CharField 和日期字段 DateTimeField 。...这种方法告诉 Django,每个字段中保存着什么类型的数据。更多字段以及含义可以阅读 Django 官方文档。 4 创建表 打开终端,切换目录到 manage.py 所在目录。...执行一下两行命令来创建数据库的表。 ? 运行成功的结果如下: ? 在数据库也会发现我们刚才新建的表 ? 5 插入与查询数据 Author 和 Book 表已经新建成功了。你可能有这样的疑惑。...5)使用 QuerySet 更新数据 A、单个 object 更新, 适合于 .get(), get_or_create(), update_or_create() 等得到的 obj,和新建很类似。
魔鬼的陷阱 QuerySet 的类型 有时候希望它简单一点 有时候希望它坚持自我 多对多和 values() ORM 终究只是 ORM 隐式转换 Mysql 低版本时间精度问题 虚假的 .query...魔鬼的陷阱 QuerySet 的类型 有时候希望它简单一点 objects.values() 返回的并不是简单类型的数据,而是 QuerySet。...print(type(f2.created)) 通过以上的例子就能知道,我们自己创建的内存对象 f1 和通过 orm 拿出来的内存对象 f2 完全不是同一个东西,虽然他们都可以操作同一条数据库记录,但如果在内存对象里做比较就会有很多问题...o.pk == f.pk # mysql 版本大于 5.6.4 时 -> False # mysql 版本小于 5.6.4 时 -> True 原因很简单,当 mysql 版本小于 5.6.4 时是不支持...microseconds 的,由于我们的 f 是内存对象,拿到的 created 又是有 microseconds 的,相当于我们在用 2020-09-18 09:24:38.260779 和 2020
【1】操作数据库# create database 数据库名字# 【2】操作数据表# create table 表名(字段信息)# drop table 表名;# show tables;# 【3】操作数据...# select * from 表名;# 【二】Django的ORM操作# 【1】操作数据库 操作不了 xxx# 直接连接某个数据库操作的# 【2】操作数据表# (1)创建表# 在models.py...重载# [3] 修改某个字段的类型# 打开 models.py 找到对应的字段# 修改当前字段的类型 ---> 重载# (4)查看表信息 Django 的 ORM# 直接看 models.py 文件中定义了哪些类...# 返回值是一个 QuerySet 对象 是一个列表 # 没有符合条件的数据就是空的 QuerySet 对象 是一个空列表 # 符合条件的多个数据 QuerySet 对象...八Django的相应数据打包成符合 HTTP 协议的响应数据# 【5】回给客户端 (浏览器) 进行渲染【四】有名分组和无名分组# 【零】前提# 有名分组和无名分组的前提是 基于正则表达式书写 路由#
实现使用category查询和name字段的模糊查询#models.pyfrom django.db import models# Create your models here.# 定义一个菜品种类class...CategorySerializer permission_classes = [IsAuthenticated]class DishView(ReadOnlyModelViewSet): queryset..., name, value): return queryset.filter(name__icontains=value) def filter_category(self,...queryset, name, value): return queryset.filter(category_id=value) class Meta:...model = Dish fields = ['name','category']queryset是model(Dish)的查询集name是查询的字段value是查询的内容需要说明外键字段不支持模糊查询否则报错
1 前言 当我们建立好数据模型,Django 会自动为我们生成一套数据库接口相关的接口。这套接口称为 QuerySet API。为什么叫 QuerySet ?...所以我们在Python 中处理 Unicode 对象的时候,你可以直接将它们混合使用和互相匹配而不必去考虑编码细节。 2 创建对象 为了更加直观的操作数据库,我使用 Django 的 API 来讲解。...如果模型中存在有一对多,多对一,多对多的关系,先把相关的对象查询出来或者创建出来,才能创建该模型。例如我们要创建 Book 对象,首先要创建 Author 和 Publisher 对象。...还支持跟 SQL 语法中的组合查询,具体用法如下: # 查询结果中同时满足 name=清华大学出版社 和 address=上海, 这两个条件 Publisher.objects.filter(name...可惜的是 QuerySet 是不支持负查询。 但是也有替代方法 # 使用 reverse() 将 QuerySet 的顺序倒置下 # 再使用正查询, 下面的例子表示查询最后两条数据。