事务操作通常会涉及用户和产品的一些属性,所以我们经常使用 select_related 来强制 join 并保存一些查询。 更新交易还会涉及获得一个锁来确保它不被别人获得。 现在,你看到问题了吗?...当 select_for_update 与 select_related 一起使用时,Django 将尝试获取查询中所有表的锁。 我们用来获取事务的代码尝试获取事务表、用户、产品、类别表的锁。...典型的例子是 M2M(多对多)关系的直通模型: class Membership(Model): group = ForeignKey(Group) user = ForeignKey(...组合索引中列的顺序(Order of columns in composite index) 具有多个列的索引称为组合索引。在 B-Tree 组合索引中,第一列使用树结构进行索引。...并不是,数据库为特定用例提供其他类型的索引也蛮多的。 从 Django 1.11 开始,有一个新的 Meta 选项用于在模型上创建索引。这给了我们探索其他类型索引的机会。
数据库设计三大范式 第一范式(1NF):列不可再分(原子性) 每一列属性都是不可再分的,两列的属性相近或相似或一样,应尽量合并属性一样的列,确保不产生冗余数据。...与prefetch_related select_related 括号内只能放一对一、一对多的外键字段,特点:内部自动连表操作,会将括号内外键字段所关联的表与当前表自动拼接成一张表,然后将表中的数据一个一个查询出来封装成一个一个的对象...select_related()括号内放多个外键字段,逗号隔开,会将多个外键字段关联的表与当前表拼成一张大表。...使用:主要用于多对多字段和一对多字段 耗时:查询的次数上 res = models.Book.objects.prefetch_related('publisher') for i in res...:模型层、模板层、视图层 Django自称是MTV框架,其实本质还是MCV MCV(models views controllar) models views controllar:模型层、视图层、控制层
为了让大家更直观地看到这两个方法的作用,我们将安装使用django-debug-toolbar这个流行的Django第三方包。...,如下图所示: 言归正传 假设我们有如下一个文章(Article)模型,其与类别(Category)是单对多地关系(ForeignKey), 与标签(Tag)是多对多的关系(ManyToMany)。...(‘blog’).filter(pub_date__gt=timezone.now()) prefetch_related方法 对于多对多字段,你不能使用select_related方法,这样做是为了避免对多对多字段执行...如果不确定是否有重复查询,可使用django-debug-toolbar查看。...对与单对单或单对多外键ForeignKey字段,使用select_related方法 对于多对多字段和反向外键关系,使用prefetch_related方法 两种方法均支持双下划线指定需要查询的关联对象的字段名
Django网络应用开发的5项基础核心技术包括模型(Model)的设计,URL 的设计与配置,View(视图)的编写,Template(模板)的设计和Form(表单)的使用。...news = News.objects.select_related('category', 'author').get(pk=news_id) select_related 主要针一对一和多对一关系进行优化...select_related 使用SQL的JOIN语句进行优化,通过减少SQL查询的次数来进行优化、提高性能。 可以通过可变长参数指定需要 select_related 的字段名。...也可以通过使用双下划线“__”连接字段名来实现指定的递归查询。没有指定的字段不会缓存,没有指定的深度不会缓存,如果要访问的话 Django 会再次进行SQL查询。...也接受无参数的调用,Django 会尽可能深的递归查询所有的字段。但注意有Django 递归的限制和性能的浪费。
中介模型 处理类似搭配 pizza 和 topping 这样简单的多对多关系时,使用标准的ManyToManyField 就可以了。但是,有时你可能需要关联数据到两个模型之间的关系上。...对于这些情况,Django 允许你指定一个中介模型来定义多对多关系。 你可以将其他字段放在中介模型里面。源模型的ManyToManyField 字段将使用through 参数指向中介模型。...所以它们不能在使用中介模型的多对多关系中使用。此时,唯一的办法就是创建中介模型的实例。 remove()方法被禁用也是出于同样的原因。但是clear() 方法却是可用的。...简单说,在对QuerySet使用select_related()函数后,Django会获取相应外键对应的对象,从而在之后需要的时候不必再查询数据库了。...也接受无参数的调用,Django会尽可能深的递归查询所有的字段。但注意有Django递归的限制和性能的浪费。 Django >= 1.7,链式调用的select_related相当于使用可变长参数。
关键字参数指定的Annotation将使用关键字作为Annotation 的别名。 匿名参数的别名将基于聚合函数的名称和模型的字段生成。 只有引用单个字段的聚合表达式才可以使用匿名参数。...如果不传递任何值给values_list(),它将返回模型中的所有字段,以在模型中定义的顺序。 常见的情况是获取某个模型实例的特定字段值。...不适用于多表继承场景中的子模型。 如果模型的主键是AutoField,则不会像save()那样检索并设置主键属性,除非数据库后端支持。 不适用于多对多关系。...使用关键字参数指定的聚合将使用关键字参数的名称作为Annotation 的名称。 匿名参数的名称将基于聚合函数的名称和模型字段生成。 复杂的聚合不可以使用匿名参数,必须指定一个关键字参数作为别名。...唯一限制是它只能更新模型主表中的列,而不是关联的模型,例如不能这样做: >>> Entry.objects.update(blog__name='foo') # Won't work!
二 中介模型 处理类似搭配 pizza 和 topping 这样简单的多对多关系时,使用标准的ManyToManyField 就可以了。但是,有时你可能需要关联数据到两个模型之间的关系上。...对于这些情况,Django 允许你指定一个中介模型来定义多对多关系。 你可以将其他字段放在中介模型里面。源模型的ManyToManyField 字段将使用through 参数指向中介模型。...所以它们不能在使用中介模型的多对多关系中使用。此时,唯一的办法就是创建中介模型的实例。 remove()方法被禁用也是出于同样的原因。但是clear() 方法却是可用的。...nid" = 1; 总结 select_related主要针一对一和多对一关系进行优化。 select_related使用SQL的JOIN语句进行优化,通过减少SQL查询的次数来进行优化、提高性能。...Django >= 1.7,链式调用的select_related相当于使用可变长参数。Django select_related失效,只保留最后一个。
) 附加SQL查询 defer() 不加载指定字段 only() 只加载指定的字段 using() 选择数据库 select_for_update() raw() raw() 使用...() 如果我要拿这个模型通过外键绑定的另外一个模型,使用select_related course 模型定义了teacher字段绑定teacher模型 course = Course.objects.only...当我们需要对查询集(queryset)的某些字段进行计算或进行先分组再计算或排序, 我们就需要使用aggregate和annotate方法了。...aggregate(Max('price')) {'price__max': Decimal('81.20')} annotate 先介绍F,annotate 必用F F介绍 -个F()对象表示一个模型字段或注释的列的值...这样就可以引用模型字段值并使用它们执行数据库操作,而无需实际将它们从数据库中拉出到Python内存中 说白了就是我从数据库拿东西,但是有些需要的字段没有,要通过绑定的外键的app的model拿。
obj.id obj.name.....就是数据库一行数据中的一部分数据 ORM--First: 我们在学习django中的orm的时候,我们可以把一对多,多对多,分为正向和反向查找两种方式。...django的filter方法是从数据库的取得匹配的结果,返回一个对象列表,如果记录不存在的话,它会返回[]。 ? ORM的一对多: 我们在设计表结构的时候什么时候使用一对多呢?...比如我们在建立用户的时候有个菜单让我们选择用户类型的时候,使用一对多!!...查询--方法一: 第一种方式都是基于表中的对象去找到第三张表! 通过间接的方式找到这张表的句柄! ?...Django中的F和Q F:用来批量修改数据(使用查询条件的值) demo:比如我有个price这个列,我想让price自增10或者某一些自增10 ?
目录索引的优化查询集的延迟加载使用select_related进行关联查询使用prefetch_related进行预取延迟计算字段使用values()和values_list()方法选择需要的字段使用annotate...在Django中,我们可以使用db_index属性在模型字段上创建索引。...使用select_related进行关联查询在涉及到关联表的查询中,使用select_related()方法可以减少数据库查询的次数。...select_related()方法会在查询时一次性将相关的对象也查询出来,而不是每次访问关联对象时都执行一次查询。例如,我们有一个Book模型和一个Author模型,它们之间存在一对多关系。...例如,我们有一个Book模型和一个Category模型,它们之间存在多对多关系。
manager有create()、get_or_create(),而QuerySet有delete()等,看源码就可以很容易的清楚Manager类与Queryset类的关系,Manager类的绝大部分方法是基于...或onetomany,那用select_related,不过对于onetomany,只能在主表(定义onetomany关系的那个表)的manager中使用select_related方法,即通过select_related...>>> Entry.objects.filter(blog=1) #我个人不建议这样用,对于create(),不支持这种用法 >>> myentry = Entry.objects.get(id...>>> b = User.objects.filter(is_active=True, job__is_active=True).annotate(n=Count(‘job__name’)) #多对多反向连接...,User与Job是多对多 >>> len(a) #这里才会对a求值 >>> len(b) #这里才会对b求值 a对应的SQL语句为(SQL中没有为表起别名,u、ut是我加的): select
乐观锁适用于多读的应用类型,这样可以提高吞吐量,像数据库提供的类似于write_condition机制,其实都是提供的乐观锁。...一、Django中的悲观锁 Django中使用悲观锁锁定一个对象,需要使用select_for_update()方法。它本质是一个行级锁,能锁定所有匹配的行,直到事务结束。...select_for_update与select_related方法时,select_related指定的相关对象也会被锁定。...二、Django中的乐观锁 Django项目中实现乐观锁可以借助于django-concurrency这个第三方库, 它可以给模型增加一个version字段,每次执行save操作时会自动给版本号+1。...乐观锁:适用于多读场景
其实模型名字.objects是一个django.db.models.manager.Manager对象,而Manager这个类是一个“空壳”的类,他本身是没有任何的属性和方法的。...image 所以我们如果想要学习ORM模型的查找操作,首先要学会QuerySet上的一些API的使用。 2. QuerySet的方法 在使用QuerySet进行查找操作的时候,可以提供多种操作。...>等 7.all:获取这个ORM模型的QuerySet对象。 select_related:在提取某个模型的数据的同时,也提前将相关联的数据提取出来。...比如提取文章数据,可以使用select_related将author信息提取出来,以后再次使用article.author的时候就不需要再次去访问数据库了。...,不能用在多对多或者多对一中。
通过使用 ORM,我们只需要操作 Author 和 Blog 对象,而不用操作相关的数据库表。这里主要介绍一下 Django ORM 的相关使用。...同时 ORM 避免了不规范、冗余、风格不统一的 SQL 语句,可以避免很多人为的 bug,方便编码风格的统一和后期维护。...将数据库表和对象模型关联,我们只需针对相关的对象模型进行编码,无须考虑对象模型和数据库表之间的转化,大大提高了程序的开发效率。 方便数据库的迁移。...ORM 模块,我们来看下具体的使用,部分内容会给出基于 MySQL 的 SQL 语句。...与 select_related 不同的是 prefetch_related 不使用 JOIN 方式来查询数据库,而是分别查每个表,最后使用 Python 来实现 JOIN 操作。
总结: 1. select_related主要针一对一和多对一关系进行优化。...2. select_related使用SQL的JOIN语句进行优化,通过减少SQL查询的次数来进行优化、提高性能。...对于多对多字段(ManyToManyField)和一对多字段,可以使用prefetch_related()来进行优化。...models.UserInfo.objects.defer('username','id') 或 models.UserInfo.objects.filter(...).defer('username','id') #映射中排除某列数据...终端打印SQL语句 在Django项目的settings.py文件中,在最后复制粘贴如下代码:即为你的Django项目配置上一个名为django.db.backends的logger实例即可查看翻译后的
,nginx的并发能力强,在纯静态的web服务中更是突出其优越的地方,由于底层使用epoll异步IO模型进行处理。...事件循环 7、select_related和prefetch_related,Q和F select_related:一对多使用,查询主动做连表...prefetch_related:多对多或者一对多的时候使用,不做连表,做多次查询 Q:用于构造复杂查询条件 F:更新时用于获取原来的值,专门取对象中某一列进行操作...使用django开发站点时,可以使用django-debug-toolbar来进行调试,在settings.py中添加 'debug—toolbar.midleware.Debug ToolbarMiddleware...Django内置的ORM跟框架内的其他模块耦合程度高。应用程序必须使用Django内置的ORM,否则就不能享受到框架内提供的种种基于其ORM的便利。
在开发基于Django的Web应用程序时,数据库是至关重要的组成部分之一。Django的ORM(对象关系映射)为开发者提供了便利,使得与数据库的交互变得简单且直观。...使用索引 索引是提高数据库查询效率的关键。在Django中,可以通过在模型的字段上添加db_index=True来为字段创建索引。...,使用select_related和prefetch_related可以减少数据库查询次数,提高性能。...from myapp.models import Author, Book # 使用select_related book = Book.objects.select_related('author'...使用Raw SQL 在某些情况下,使用原生的SQL语句可能比ORM更高效。Django允许执行原生SQL查询,这在需要进行复杂的数据操作时非常有用。
在 Django 中我们通常会使用 selected_related 或prefetch_related 来预取关联对象,来减少和 DB 之间的交互,但是在使用上也需要有一些注意的地方。...Django 默认的查询方式都是粗放的,例如普通查询不使用 values 或者 only 时都是 select * ,而预取也不例外,看看下面这个例子。...此时在后续的循环处理中,我们需要通过 Foo 对象查询到 Baz 的数据,为了避免 N + 1 我们也会多级预取: Foo.objects.filter().select_related("bars")...Foo.objects.filter().select_related("bars") .prefetch_related( Prefetch("bars__bazs", queryset=Baz.objects.defer...用 SQL 有时会更直接清晰地多。所以也会有一些完全不使用 ORM 的观点。
打开pay应用的models.py创建模型类 from datetime import datetime from django.db import models # Create your models...admin.site.register(Brand) admin.site.register(Goods) 1) 数据库表名 模型类如果未指明表名,Django默认以小写app应用名_小写模型类名为数据库表名...2) 关于主键 django会为表创建自动增长的主键列,每个模型只能有一个主键列,如果使用选项设置某属性为主键列后django不会再创建自动增长的主键列。...默认创建的主键列属性为id,可以使用pk代替,pk全拼为primary key。...:实用一对一,多对一关系 直接join sql比较简单请自己看 prefetch_related:适用于多对多,一对多情况 是在第一次使用的时候发送 select * from goods where
其实模型名字.objects是一个django.db.models.manager.Manager对象,而Manager这个类是一个“空壳”的类,他本身是没有任何的属性和方法的。...select_related select_related:在提取某个模型的数据的同时,也提前将相关联的数据提取出来。...,不能用在多对多或者多对一中。...这个方法是为了解决多对一和多对多的关系的查询问题。...,这时候我们可以使用django.db.models.Prefetch来实现,Prefetch这个可以提前定义好queryset。
领取专属 10元无门槛券
手把手带您无忧上云