一、查询基础QuerySet 详解Django 中通过模型类的 Manager 构建 QuerySet 来检索数据库对象,其核心特性包括:代表数据库中对象的集合可通过过滤器缩小查询范围具有惰性执行特性(...b = Book.objects.select_related().get(id=2)print(b.author) # 已预加载到缓存,使用缓存,不查询数据库反向查询(通过关联管理器)# 未定义related_name...检测方法Django Debug Toolbar:直观显示请求中的 SQL 查询日志记录:配置日志记录 SQL 语句性能分析工具:如 Django Silk 分析查询性能解决方案方法 1:使用 select_related...2:使用 prefetch_related适用于多对多和反向关系,通过批量查询后在 Python 中关联。...")print(queryset.query) # 输出对应的SQL语句四、项目实战场景Django+Vue 后台管理系统中,一般需要支持不同的数据权限仅本人数据权限本部门及以下数据权限本部门数据权限指定部门数据权限全部数据权限数据权限与功能权限
> 说明1:由于员工与部门之间存在多对一外键关联,所以也能通过部门反向查询该部门的员工(从一对多关系中“一”的一方查询“多”的一方),反向查询属性默认的名字是类名小写_set(如上面例子中的emp_set...),当然也可以在创建模型时通过ForeingKey的related_name属性指定反向查询属性的名字。...如果不希望执行反向查询可以将related_name属性设置为'+'或以'+'开头的字符串。...related_name:用于获取关联对象的关联管理器对象(反向查询),如果不允许反向,该属性应该被设置为'+',或者以'+'结尾。 to_field:指定关联的字段,默认关联对象的主键字段。.../ iregex:基于正则表达式的模糊匹配查询 Q对象(用于执行复杂查询)的使用: >>> from django.db.models import Q >>> Emp.objects.filter(
) 反向排序QuerySet中返回的元素。...在传递给select_related的字段中,还可以反向引用OneToOneField。也就是说,可以回溯到定义OneToOneField 的字段。...当最初获取数据时不知道是否需要这些特定字段的情况下,如果正在使用查询集的结果,可以告诉Django不要从数据库中检索它们。...每个延迟字段将在你访问该字段时从数据库中检索(每次只检索一个,而不是一次检索所有的延迟字段)。 可以多次调用defer()。...在Django1.11在defaults中增加了对可调用值的支持。
Django 关系字段 本文主要内容是关于Django框架中models的知识小结 #1 环境 Python3.7.3 Django==2.0.7 #2 字段 #2.1 一对多(ForeignKey)...一对多 : fk字段在"多"的models中定义 from django.db import models class Blog(models.Model): name = models.CharField...#2.5 反向查找 (related_name) from django.db import models class Blog(models.Model): name = models.CharField...QuerySet []> #2.6 反向直接获取数据 (related_query_name) 正常查询 >>> b = models.Blog.objects.get(id=1...(to,**options) MtoM字段根据需求可以放到两个有关联的表中的任意一个 from django.db import models class Author(models.Model):
查询参数(上面函数定义中的**kwargs)需要满足特定的格式,字段检索一节中会提到。...一般来说,对 QuerySet 切片会返回新的 QuerySet – 这个过程中不会对运行查询。不过也有例外,如果你在切片时使用了 “step” 参数,查询集就会被求值,就在数据库中运行查询。...字段筛选条件 字段筛选条件就是 SQL 语句中的 WHERE 从句。就是 Django 中的 QuerySet 的 filter(), exclude() 和 get() 方法中的关键字参数。...如果我们要对两个字段的值做比较,那该怎么做呢? Django 提供 F() 来做这样的比较。F() 的实例可以在查询中引用字段,来比较同一个 model 实例中两个不同字段的值。...任何一个 model 在第一次调用时,Django 就会遍历所有的 INSTALLED_APPS 的所有 models,并且在内存中创建中必要的反向连接。
PEP8规范, 广泛用于 Python 领域, 因此我建议你在项目中使用它. 除了 PEP8 , 我更喜欢Django编程风格....在 DJango 中,我们可以通过Company.objects来访问集合. 我可以通过定义models.Manager重命名objects属性....companies = models.Manager() 而后, 可以通过下面语句来使用 Django ORM QuerySet 查询....related_name ForeignKey 的 related_name 可以为反向关系定义一个有意义的名称 经验法则: 如果你不确定related_name是什么, 请使用包含所定义ForeignKey...Blank 和 Null 我在另一篇文章有讲过两者的区别 Blank or Null,在这里我会总结一下. null: 数据库相关; 定义数据库字段的值是否接受空值。
,也可以覆写为别的名称 2、id 字段是自动添加的 3、对于外键字段,Django 会在字段名上添加"_id" 来创建数据库中的列名 4、这个例子中的CREATE TABLE SQL 语句使用PostgreSQL...返回数据库中匹配查询(QuerySet)的对象数量。 ...: 查询人民出版社出版过的所有书籍的名字与价格(一对多) # 反向查询 不再按表名:book,而是related_name:bookList queryResult=Publish.objects...如果我们要对两个字段的值做比较,那该怎么做呢? Django 提供 F() 来做这样的比较。F() 的实例可以在查询中引用字段,来比较同一个 model 实例中两个不同字段的值。 ?...(例如,遍历 QuerySet,在每个对象上调用 delete()方法),而不是使用 QuerySet 中的 delete()方法。
Django的数据模型的建立过程很简单,就是继承django.db.models中的Model类,然后给它增加属性。每一个属性可以对应关系数据库中的一个字段。...这里的max_length=10对应了限制条件: VARCHAR(10) (在MySQL V4中,代表了10个字节;在MySQL V5中,代表了10个字符。)...有一些限制条件是Django提供的,并没有数据库层面的对应物,比如blank。 (当blank参数为真时,对应字段可以为留为空白。) 在基本的模型设计上,Django ORM没有留什么坑。...需要注意的是,在Django ORM中,只能通过ForeignKey来定义多对一关系,不能显示地定义一对多关系。但你可以使用模型对象的*_set语法来反向调用多对一关系。...此外,多对多关系也可以用类似的方式反向调用,比如: group.customer_set 此外,你还可以在模型中加入related_name参数,从而在反省调用时,改用"*_set"之外的其他名称,比如
使用 Django 的模型,都是 django.db.models.Model 类的子类。 每个类将被转成数据库表。 每个字段由 django.db.models.Field 子类转成数据库的列。...模型之间的关系使用 ForeignKey 字段。 位置参数 related_name 用于引用关联的模型。 related_name 参数将用于创建反向关系。...在 论坛的回帖模型中,related_name = "+",不需要这种反向关系,不需要关系用户修改过哪些帖子。...import login_required from django.views.generic import UpdateView, ListView from django.utils import...(self): queryset = super().get_queryset() return queryset.filter(created_by=self.request.user
注意事项: 表的名称myapp_modelName,是根据 模型中的元数据自动生成的,也可以覆写为别的名称 id 字段是自动添加的 对于外键字段,Django 会在字段名上添加"_id" 来创建数据库中的列名... Django 还提供了一种直观而高效的方式在查询(lookups)中表示关联关系,它能自动确认 SQL JOIN 联系。...''' 正向查询按字段,反向查询按表名小写用来告诉ORM引擎join哪张表 ''' 一对多查询 # 练习: 查询苹果出版社出版过的所有书籍的名字与价格(一对多) # 正向查询 按字段...反向查询时,如果定义了related_name ,则用related_name替换表名,例如: publish = ForeignKey(Blog, related_name='bookList')...如果我们要对两个字段的值做比较,那该怎么做呢? Django 提供 F() 来做这样的比较。F() 的实例可以在查询中引用字段,来比较同一个 model 实例中两个不同字段的值。
:(在django中,根据代码中的类自动生成数据库的表也叫--code first) ORM:Object Relational Mapping(关系对象映射) 类名对应------》数据库中的表名 类属性对应...正向查找:ForeignKey在 UserInfo表中,如果从UserInfo表开始向其他的表进行查询,这个就是正向操作,反之如果从UserType表去查询其他的表这个就是反向操作。...(方便反向查找) 在写ForeignKey字段的时候,如果想要在反向查找时不使用默认的 小写的表名_set,就在定义这个字段的时间加related参数!...related_name、related_query_name 字段=什么别名 反向查找时就使用什么别名!...此时Django为我们提供了F和Q查询: 1、F 可以获取对象中的字段的属性(列),并对其进行操作; from django.db.models import F,Q #F 可以获取对象中的字段的属性
对应app目录下的models.py 1、生成一个简单的数据库表: 在未指定primary_key的情况下,Django会默认创建一个id自增字段作为主键。...QuerySet是惰性执行的,创建Query Set不会访问数据库,只有在访问具体查询结果的时候才会访问数据库。...5. reverse(): reverse() 反向排序QuerySet中返回的元素。 第二次调用reverse()将恢复到原有的排序。 ...Django不支持负索引。 6.distinct(): distinct(*fields) 去除查询结果中重复的行。 默认情况下,QuerySet不会去除重复的行。...Q查询 F查询专门取对象中某列值的操作,F的作用:用来批量修改数据的 #导入F from django.db.models import F #把table1表中的num列中的每一个值在的基础上加10
(): 对查询结果反向排序,请注意reverse()通常只能在具有已定义顺序的QuerySet上调用(在model类的Meta中指定ordering或调用order_by()方法...此时可以使用distinct(),注意只有在PostgreSQL中支持按字段去重。) count(): 返回数据库中匹配查询(QuerySet)的对象数量。...Q查询 F查询 在上面所有的例子中,我们构造的过滤器都只是将字段值与某个常量做比较。...如果我们要对两个字段的值做比较,那该怎么做呢? Django 提供 F() 来做这样的比较。F() 的实例可以在查询中引用字段,来比较同一个 model 实例中两个不同字段的值。...终端打印SQL语句 在Django项目的settings.py文件中,在最后复制粘贴如下代码: LOGGING = { 'version': 1, 'disable_existing_loggers
在了解了Django提供的模型管理平台之后,我们来看看如何从代码层面完成对模型的CRUD(Create / Read / Update / Delete)操作。...>]> 说明1:由于员工与部门之间存在多对一外键关联,所以也能通过部门反向查询该部门的员工(从一对多关系中“一”的一方查询“多”的一方),反向查询属性默认的名字是类名小写_set(如上面例子中的emp_set...),当然也可以在创建模型时通过ForeingKey的related_name属性指定反向查询属性的名字。...如果不希望执行反向查询可以将related_name属性设置为'+'或以'+'开头的字符串。...语句并获取对应的结果,这一点在实际开发中需要引起注意!
,可以看到,Django对OneToOne、OneToMany、ManyToMany关联查询及其反向关联查询提供了相同的方式,真是牛逼啊。...中的实现 在SQL中,很多关键词在删、改、查时都是可以用的,如order by、 like、in、join、union、and、or、not等等,我们以查询为例,说一下django如何映射SQL的这些关键字的...聚合函数可以像filter那样关联表,即在聚合函数中,Django对OneToOne、OneToMany、ManyToMany关联查询及其反向关联提供了相同的方式,见下面例子。...,即使在查询时关联了其它表,关联表的字段也不会返回,只有当我们通过Author instance用关联表时,Django才会再次查询数据库获取值。...看下面两段代码,这两段代码在1.1中提到过。在代码1中,在遍历a前,先执行a对应的SQL,拿到数据后,然后再遍历a,而遍历过程中,每次都还要查询数据库获取关联表。
告诉Django用pymysql代替默认的MySQLDB 连接MySQL数据库 在项目/__init__.py文件中,写下面两句: import pymysql # 告诉...c.related_name --> 反向操作时,使用的字段名,用于代替原反向查询时的'表名_set'。 ...在ORM 表单中没有char字段;需要自定义 #自定义char字段 class FixedCharField(models.Field): """ 自定义的char类型的字段类 """ def...='books') #反向操作时,使用的字段名,用于代替原反向查询时的'表名_set'。...和__查询(join查询)############################ # 正向查询:按字段 反向查询:表名小写 # 查询python这本书籍的出版社的邮箱 # ret=models.Book.objects.filter
回顾 上次咱们学习了一下Django ORM的基本查询操作。 查询操作主要使用的是filter()方法。...Django ORM的查询还有很多,继续来看叭!!! 查询操作 对象.外键字段 比如,我们拿到了一个书的信息,我们可以这样打印他的信息。...总结 对象.外键字段拿到的就是外键字段对象,直接就可以通过对象.外键字段.外键属性获取具体值。 反向查询(表名__set.all()) 上述我们是通过正向查询的方式查询到了书对应的出版社具体信息。...这个有点像列表套元组,但是其实本质还是QuerySet。 related_name related_name通常用于反向查询时,替换_set。 原方式 models.py ?...总结 本篇主要还是上篇的继续补充,还是关于filter的查询部分。 本次主要有外键字段类型,反向查询默认使用__set,还可以使用related_name反向字段查询。
在模型中放置业务逻辑。 用.DoesNotExists取代ObjectDoesNotExists。 在数据库中不要出现无效数据。 不要对QuerySet调用len()函数。...模型定义参考 字段 对字段名称的限制 字段名不能是Python的保留字,否则会导致语法错误 字段名不能有多个连续下划线,否则影响ORM查询操作 Django模型字段类 字段类 说明 AutoField...通用字段属性 选项 说明 null 数据库中对应的字段是否允许为NULL,默认为False blank 后台模型管理验证数据时,是否允许为NULL,默认为False choices 设定字段的选项,各元组中的第一个值是设置在模型上的值...related_name:用于获取关联对象的关联管理器对象(反向查询),如果不允许反向,该属性应该被设置为'+',或者以'+'结尾。 to_field:指定关联的字段,默认关联对象的主键字段。...on_delete:外键关联的对象被删除时对应的动作,可取的值包括django.db.models中定义的: CASCADE:级联删除。