特别点 本文将翻译 django 官网的 模型层的 QuerySet 章节 文档版本:1.11 Making queries 进行查询 一旦你创建了 数据表模型类,django 会自动给你一些数据库抽象...)可以使用 Q 对象 Q对象 的使用 from django.db.models import * """ , 间隔 Q 对象,是 and 关系 ( & 也是) | 间隔 Q 对象,是 or 关系 ~...(字段查询条件,双下划线查询) 此部分参考文档: django官网 字段查找(field-lookups) 字段查找(field-lookups)对应的是 SQL 语句中的 WHERE 条件,一般放在...__week # 匹配 datetime、date 类型字段,当年的第几周(1-52/53,平闰年不同) # django 1.11 中新增的 Entry.objects.filter(pub_date...__time # 匹配 datetime、time 类型字段的 minute, django 1.11 中新增的 Entry.objects.filter(pub_date__time=datetime.time
本文我将重点介绍如何有效使用 Django ORM系统访问中到大型的数据集。...Django的queryset是惰性的 Django的queryset对应于数据库的若干记录(row),通过可选的查询来过滤。...要真正从数据库获得数据,你需要遍历queryset: for person in person_set: print(person.last_name) Django的queryset是具有cache...的 当你遍历queryset时,所有匹配的记录会从数据库获取,然后转换成Django的model。...如果查询集很大的话,if 语句是个问题 如前所述,查询集缓存对于组合 if 语句和 for 语句是很强大的,它允许在一个查询集上进行有条件的循环。然而对于很大的查询集,则不适合使用查询集缓存。
如果你需要执行更复杂的查询(例如OR语句),你可以使用Q对象。...示例1: 查询作者名是小仙女或小魔女的 models.Book.objects.filter(Q(authors__name="小仙女")|Q(authors__name="小魔女")) 你可以组合& ...和| 操作符以及使用括号进行分组来编写任意复杂的Q 对象。...同时,Q 对象可以使用~ 操作符取反,这允许组合正常的查询和取反(NOT) 查询。 示例:查询作者名字是小仙女并且不是2018年出版的书的书名。...") QuerySet [('番茄物语',)]> 查询函数可以混合使用Q 对象和关键字参数。
有三个参数, 其中第一个是 必需的: FilePathField.path 必填。这个FilePathField 应该得到其选择的目录的绝对文件系统路径。...可选的.True 或 False.默认是True.声明是否包含指定位置的文件。...当然,这些参数可以同时使用。 有一点需要提醒的是 match只匹配基本文件名(base filename), 而不是整个文件路径(full path)....FilePathField实例被创建在您的数据库为varchar列默认最大长度为 100 个字符。作为与其他字段,您可以更改使用的max_length最大长度。...所以在Django中,我这样定义主要字段: title = models.CharField(max_length = 120) img = models.ImageField(upload_to
一般直接用来做 Response 没有问题,但是要知道 QuerySet 是不能被 pickle 的,如果使用到 Django Cache 之类功能,直接用 values() 当作返回会死得很惨。...有时候希望它坚持自我 很多时候我们需要限制 QuerySet 返回的字段以加快 DB 查询的速度(比如一些没索引的长字段),这时候可能的两个方法: only() & values() 。...但实际情况是,使用 values() 会改变 queryset._iterable_class ,如果后面还有更多的级联查询,会导致最后的结果为 Dict 而不是 QuerySet。...有时候我们需要使用动态字段,并且保证动态字段的值全表唯一。...动态字段我们使用 LONGTEXT 存储,格式为 JSON 。如果手动处理,需要将整个表的字段放到内存,并做唯一校验,非常麻烦且耗时。
/manage.py migrate : 数据迁移到数据库 3.django中将Querryset用字典的形式显示出来 from user.models import User...(i)) 4.获取两个模型下查询集queryset的并集和交集 (1).取并集 1. records = query1 | query2 2. records = (query1 | query2).distinct...(): 去除重复数据 django版本在1.11以后支持union方法: 1. q = query1.union(query2) : 去重 2. q = query1.union(query2,...all=True) :不去重 3. q = query1.union(query2,query3) : 多个集合求并集 注意: union只能对具有相同字段和数据类型的查询集执行联合操作 django...:values_list限制所选字段,获取不同模型之间的合并: 1.
_1.11/lib/python3.5/site-packages/django/db/models/manager.py", line 85, in manager_method return...getattr(self.get_queryset(), name)(*args, **kwargs) File "/home/python/.virtualenvs/py3_django_1.11...(readcount__gt=20).filter(id__lt=3) QuerySet []> 如果需要实现逻辑或or的查询,需要使用Q()对象结合|运算符,Q对象被义在...例:查询阅读量大于20,或编号小于3的图书,只能使用Q对象实现 >>> BookInfo.objects.filter(Q(readcount__gt=20)|Q(id__lt=3)) QuerySet...使用同一个查询集,第一次使用时会发生数据库的查询,然后Django会把结果缓存下来,再次使用这个查询集时会使用缓存的数据,减少了数据库的查询次数。
13. union() union(*other_qs, all=False) 集合中并集 使用SQL的UNION运算符组合两个或更多个QuerySet的结果。...当最初获取数据时不知道是否需要这些特定字段的情况下,如果正在使用查询集的结果,可以告诉Django不要从数据库中检索它们。...在Django1.11在defaults中增加了对可调用值的支持。...在Django1.11在defaults中增加了对可调用值的支持。...默认情况下,Django将使用get_latest_by中指定的字段。
sqlite django默认使用sqlite的数据库,默认自带sqlite的数据库驱动 , 引擎名称:django.db.backends.sqlite3 mysql...# print(objs[1]) # print(objs[1:4]) # print(objs[::-1]) QuerySet的高效使用: Django的queryset...此时Django为我们提供了F和Q查询: # F 使用查询条件的值,专门取对象中某列值的操作 # from django.db.models import F # models.Tb1...(q1)#[, ] # 2、可以组合使用&,|操作符,当一个操作符是用于两个Q的对象,它产生一个新的Q对象。...Q(title__startswith='P') | Q(title__startswith='J') # 3、Q对象可以用~操作符放在前面表示否定,也可允许否定与不否定形式的组合 Q
在当今根据需求而不断调整而成的应用程序中,通常不仅需要能依常规的字段,如字母顺序或创建日期,来对项目进行排序,还需要按其他某种动态数据对项目进行排序。Djngo聚合就能满足这些要求。...每个对象的总结可以用方法annotate()生成: # 建立一个annotate QuerySet >>> from django.db.models import Count >>> q = Book.objects.annotate...# 第二个对象 >>> q[1] Django Projects> >>> q[1].authors__count 1 也可以指定生成属性的名字: >>> q = Book.objects.annotate...就不是在原始的 QuerySet 返回结果中对每个对象中添加注解,而是根据定义在 values() 从句中的字段组合对先结果进行唯一的分组,再根据每个分组算出注解值,这个注解值是根据分组中所有的成员计算而得的...进行组合,返回的是每个unique name的聚合值。
如果你需要执行更复杂的查询(例如OR语句),你可以使用Q对象。...示例1: 查询作者名是小仙女或小魔女的 models.Book.objects.filter(Q(authors__name="小仙女")|Q(authors__name="小魔女")) 你可以组合&...和| 操作符以及使用括号进行分组来编写任意复杂的Q 对象。...同时,Q 对象可以使用~ 操作符取反,这允许组合正常的查询和取反(NOT) 查询。 示例:查询作者名字是小仙女并且不是2018年出版的书的书名。...") QuerySet [('番茄物语',)]> 查询函数可以混合使用Q 对象和关键字参数。
Django网络应用开发的5项基础核心技术包括模型(Model)的设计,URL 的设计与配置,View(视图)的编写,Template(模板)的设计和Form(表单)的使用。...② 页面加载 django.views.decorators.http 里的装饰器可以基于请求的方法来限制对视图的访问。...-> [NewsObject,News()] 对象 values()可以将Queryset 转换成列表 # 并且将Queryset的模型对象(比如News()对象) 转换为字典 , 再转换成列表...③ 搜索 from django.db.models import Q Q 对象 (django.db.models.Q) 可以对关键字参数进行封装,从而更好地应用多个查询。...可以组合使用 &(and),|(or),~(not)操作符,当一个操作符是用于两个Q的对象,它产生一个新的Q对象。 Q对象可以与关键字参数查询一起使用,不过一定要把Q对象放在关键字参数查询的前面。
filter返回的是一个QuerySet对象,filter里可以设定多个过滤条件 4、查 查询数据使用QuerySet API。...关键字参数指定的Annotation将使用关键字作为Annotation 的别名。 匿名参数的别名将基于聚合函数的名称和模型的字段生成。 只有引用单个字段的聚合表达式才可以使用匿名参数。...当查询跨越多张表的数据时,QuerySet可能得到重复的结果,这时候可以使用distinct()进行去重。...="aaa")).all() print(q1) Q对象可以组合使用&,|操作符,当一个操作符是用于两个Q对象时,会产生一个新的Q对象 #查找以"aaa"开头,或者以"bbb"结尾的所有title Q(...title__startswith="aaa") | Q(title__endswith="bbb") Q对象可以用"~"操作符放在表达式前面表示否定,也可允许否定与不否定形式的组合 #查找以"aaa"
Django的Manager和QuerySet 要从数据库检索对象,需要通过模型类的 Manager 构建一个 QuerySet。...models本身没有什么需要多说的,Django 使用了一套直观的系统:一个模型类代表一张数据表,一个模型类的实例代表数据库表中的一行记录。 模型类的save方法可以插入,更新,删除数据。...不过,若你想将 objects 用作字段名,或想使用 objects 以外的 Manager 名字,就要在模型基类中重命名。...使用len()函数求QuerySet的长度,比起使用QuerySet的count()方法效率要低一些,count()方法实际对应于数据库的聚合函数COUNT,它是数据库层面的操作,而非python。...字段查找 由于字段查询非常多,也非常常用,本文不进行说明。请直接参考Django字段查询 参考资料: 执行查询 QuerySet API参考 管理器
另外,查询到的QuerySet又是缓存的,当再次使用同一个QuerySet时,并不会再查询数据库,而是直接从缓存获取(不过,有一些特殊情况)。...可以看到,filter()的参数是变个数的键值对,而不会出现>,Q或exclude(),不过对于!=,建议使用Q查询,更不容易出错。...(对应and/or/not) 如果有or等逻辑关系呢,那就用Q类,filter中的条件可以是Q对象与非Q查询混和使用,但不建议这样做,因为混和查询时Q对象要放前面,这样就有难免忘记顺序而出错,所以如果使用...Q对象也很简单,就是把原来filter中的各个条件分别放在一个Q()即可,不过我们还可以使用或与非,分别对应符号为”|”和”&”和”~”,而且这些逻辑操作返回的还是一个Q对象,另外,逗号是各组条件的基本连接符...数量,字段命名为ut_num,返回的QuerySet中的每个object都有 #这个字段。
说明2:查询多个对象的时候返回的是QuerySet对象,QuerySet使用了惰性查询,即在创建QuerySet对象的过程中不涉及任何数据库活动,等真正用到对象时(求值QuerySet)才向数据库发送SQL...字段对应到数据库表中的列名,未指定时直接使用字段的名称 db_index 设置为True时将在该字段创建索引 db_tablespace 为有索引的字段设置使用的表空间,默认为DEFAULT_INDEX_TABLESPACE...创建对象时写入权限表的额外权限 default_permissions 默认为('add', 'change', 'delete') unique_together 设定组合在一起时必须独一无二的字段名.../ iregex:基于正则表达式的模糊匹配查询 Q对象(用于执行复杂查询)的使用: >>> from django.db.models import Q >>> Emp.objects.filter(...Q(sal__gte=5000) | Q(comm__gte=1000) ... ) # 查询名字以“张”开头且工资大于等于5000或补贴大于等于1000的员工 QuerySet [<Emp: 张三丰
所有数据字段的属性都必须继承自抽象类django.db.models.Field,开发者可以继承该抽象类来定义自己的字段类型,当然也可以使用Django自带的一系列Field子类。...使用时,需引入django.db.models包,常用字段类型如下: 字段类型 描述 AutoField 根据实际ID自动增长的整数字段,通常不需要直接使用,Django会自动生成ID字段并且自动增长。...可以对Q对象进行& | ~操作,表示SQL语句中的逻辑运算符not and or,使用之前需要导入Q类。...from django.db.models import Q # 查询id大于3且学校为北京大学的学生 StudentInfo.objects.filter(Q(id__gt=3) & Q(school...StudentInfo.objects.filter(~Q(id__gt=3)) 聚合 对QuerySet对象调用aggregate方法表示 对查询结果进行聚合操作,返回的是一个字典,使用前需导入相应的聚合类
领取专属 10元无门槛券
手把手带您无忧上云