# 程序接口程序接口是应用程序与数据库的必要纽带,是数据库提供给数据库应用程序使用的,可以访问操作数据库的软件层。程序接口具备以下能力:简化数据库操作,通过简单的函数调用完成复杂的数据库操作。...按照YashanDB通讯协议,将应用程序的请求发往数据库实例,同时将数据库实例的回应返回给应用程序。...通过YashanDB的网络服务,应用程序可以连接到数据库实例上进行操作,数据库实例间也可以完成数据同步和内部任务协同等。# 客户端连接会话客户端通常通过数据库提供的驱动接口连接数据库服务。...# 连接池内部互联总线采取多路复用技术,支持多个会话共同使用一个或多个网络链路进行通讯。内部互联总线将连接到某一个节点的具有相同通讯功能的一个或多个链路封装在一个连接池中,以池化方式进行管理。...内部模块可以根据自身需要,从连接池里选择某个随机链路或特定链路进行消息发送。# 消息分发内部互联总线中每一个链路都有特定的接收监听器线程进行消息接收处理。
若要这样做,你必须为你的所有的应用的模型建立DATABASE_ROUTERS,包括正在使用的contrib 中的应用和第三方应用,以使得不会有查询被路由到默认的数据库。...因此,为了同步所有模型到我们示例中的所有数据库,你将需要调用: $ ./manage.py migrate $ ..../manage.py migrate --database=users 如果你不想每个应用都被同步到同一台数据库上,你可以定义一个数据库路由,它实现一个策略来控制特定模型的访问性。...那么 —— 在实际应用中这以为着什么?让我们看一下另外一个配置的例子。这个配置将有几个数据库:一个用于auth 应用,所有其它应用使用一个具有两个读replica 的 primary/replica。...,其中一个给定类型的所有对象都将保存在一个特定的数据库上(例如,所有的User保存在other 数据库中)。
连接池以及 ORM Session 确实具有逻辑,以便当会话和/或连接对象被垃圾收集时,会导致底层连接资源被释放,但是不能依赖此行为及时释放资源。...问题在于,在两个具有共同基表的加入继承模型之间进行连接时,不能形成适当的 SQL JOIN 而不对其中一侧应用别名;SQLAlchemy 将别名应用于连接的右侧。...对象的实例以及其扩展的 AsyncSession 代理对象上调用并发方法。...此 API 具有自己的错误场景,其中大部分涉及在用户定义的类上构建 __init__() 方法;在类上声明的属性的顺序,以及在超类上的顺序决定了 __init__() 方法将如何构建,并且有特定规则规定了属性的组织方式以及它们应该如何使用参数...此 API 具有自己的错误场景,其中大多数涉及在用户定义的类上构建__init__()方法;在类上声明的属性的顺序,以及在超类上声明的属性,决定了__init__()方法将如何构建,并且有特定规则规定了属性的组织方式以及它们应如何使用参数
一组 ORM 模型通常会具有一种对所有映射类都通用的主键风格。还可能存在一些常见的列配置,例如带有默认值的时间戳和其他预先设置大小和配置的字段。...如果应用程序希望具有完全明确的模型,并使用表反射,那么 DeferredReflection 类可能更可取,因为它的方法较少自动化。...一组 ORM 模型通常会有一种对所有映射类都通用的主键样式。还可能有常见的列配置,例如具有默认值的时间戳和其他预先设置大小和配置的字段。...一组 ORM 模型通常会有一种对所有映射类都通用的主键样式。还可能有常见的列配置,例如具有默认值的时间戳和其他预先确定大小和配置的字段。...对于应用场景,特定类型的enum.Enum或typing.Literal应链接到其他类型的情况,这些特定类型也可以放置在类型映射中。
ForeignKey,那么该ForeignKey所指的模型实例可以通过一个Manager返回第一个模型的所有实例。...你以不应该在检索模型时延迟的字段调用它。 如果你有一个模型几乎所有的字段需要延迟,使用only()指定补充的字段集可以导致更简单的代码。...它的行为与可调用对象几乎相同,但这时的self 是模型实例。 ...与上一节中详述的钩型ModelAdmin方法不同,这五个方法实际上被设计为从管理应用程序URL调度处理程序调用为Django视图,以呈现处理模型实例的页面CRUD操作。 ...在 admin 目录下, 以你的应用名创建子目录. 在应用名的目录下,以你模型层的名字创建子目录.
实例:我们来假定下面这些概念,字段和关系 作者模型:一个作者有姓名和年龄。 作者详细模型:把作者的详情放到详情表,包含生日,手机号,家庭住址等信息。..._meta.model_name获取小写的表名,还有model对象.app_label可以获取这个对象的app应用名等等操作。...定义好模型之后,你需要告诉Django _使用_这些模型。你要做的就是修改配置文件中的INSTALL_APPSZ中设置,在其中添加models.py所在应用的名称。...多对多关系其它常用API: book_obj.authors.remove() # 将某个特定的对象从被关联对象集合中去除。...要做跨关系查询,就使用两个下划线来链接模型(model)间关联字段的名称,直到最终链接到你想要的model 为止。
模型关联在底层帮我们解决好了数据关联和匹配,应用程序中不需要再去写join语句和子查询,应用代码的可读性和易维护性更高。...还是以官方文档的例子说起,一个 Country 模型可以通过中间的 User 模型获得多个 Post 模型。在这个例子中,您可以轻易地收集给定国家的所有博客文章。...动态属性加载关联模型 上面我们定义了三种使用频次比较高的模型关联,下面我们再来看一下在使用它们时关联模型时如何加载出来的。...,会调用与属性名相同的关联方法,拿到关联实例后会去调用关联实例的 getResults方法返回关联的模型数据。...where条件等的约束,比如: $user->posts()->where('created_at', ">", "2018-01-01"); Relation实例会将这些调用通过 __call转发给子模型的
可以是一个值或者可调用对象。如果可调用 ,每有新对象被创建它都会被调用。 help_text 表单部件额外显示的帮助内容。即使字段不在表单中使用,它对生成文档也很有用。...另见 ForeignKey 字段还接受许多别的参数,在模型字段参考有详细介绍。这些选项帮助定义关联关系应该如何工作;它们都是可选的参数。...模型的方法 可以在模型上定义自定义的方法来给你的对象添加自定义的“底层”功能。Manager 方法用于“表范围”的事务,模型的方法应该着眼于特定的模型实例。...模型实例参考 具有一个完整的为模型自动生成的方法 列表。...任何具有唯一标识自己的URL 的对象都应该定义这个方法。 覆盖预定义的模型方法 还有另外一部分封装数据库行为的模型方法,你可能想要自定义它们。
执行查询 一旦你建立好数据模型之后,django会自动生成一套数据库抽象的API,可以让你执行增删改查的操作。这篇文档阐述了如何使用这些API。关于所有模型检索选项的详细内容,请见数据模型参考。...在整个文档(以及参考)中,我们会大量使用下面的模型,它构成了一个博客应用。...为了把数据库表中的数据表示成python对象,django使用一种直观的方式:一个模型类代表数据库的一个表,一个模型的实例代表数据库表中的一条特定的记录。...要做跨关系查询,就使用两个下划线来链接模型(model)间关联字段的名称,直到最终链接到你想要的 model 为止。...model 的实例自带一套很方便的API以获取关联的对象。
如果不传递任何值给values_list(),它将返回模型中的所有字段,以在模型中定义的顺序。 常见的情况是获取某个模型实例的特定字段值。...' values()和values_list()都用于特定情况下的优化:检索数据子集,而无需创建模型实例。...,表示QuerySet内容中特定种类的所有可用日期。...通过传递字段名称到defer()实现不加载: Entry.objects.defer("headline", "body") 具有延迟加载字段的查询集仍将返回模型实例。...Entry.objects.defer("body").only("headline", "body") 当对具有延迟字段的实例调用save()时,仅保存加载的字段。
## 映射类行为 使用registry对象进行所有映射风格时,以下行为是共同的: 默认构造函数 registry将默认构造函数,即__init__方法,应用于所有未明确具有自己__init__方法的映射类...请参阅下一节在加载时保持非映射状态了解如何在加载对象时调用特殊逻辑的基础知识。 包含显式__init__()方法的类将保留该方法,并且不会应用默认构造函数。...当应用于映射类的实例时,而不是类本身时,返回的对象被称为InstanceState,它将提供链接到不仅是类使用的Mapper的详细接口,还提供有关实例内个别属性状态的信息,包括它们当前的值以及这如何与它们的数据库加载值相关联...当应用于映射类的实例时,而不是类本身时,返回的对象被称为 InstanceState,它将提供链接,不仅链接到类使用的 Mapper,还提供了一个详细的界面,提供了关于实例内部属性状态的信息,包括它们当前的值以及这与它们的数据库加载值有何关系...当应用于映射类的实例而不是类本身时,返回的对象被称为 InstanceState,它将提供链接到不仅由该类使用的 Mapper,还提供了有关实例内部属性状态的详细接口的信息,包括它们的当前值以及这与它们的数据库加载值的关系
如果您已经有 Web 开发经验并且觉得它的细节太多,您可以浏览图片以了解我们将要构建的内容,然后跳转到本教程的模型 部分。 但是,如果您不熟悉 Web 开发,我强烈建议您继续阅读。...我们将通过实现反向关系来实现这一点,其中 Django 将自动在数据库中执行查询以返回属于特定主题的所有帖子 的列表。 好的,现在足够的 UML!...我们将在board/models.py 文件中完成所有工作。下面是我们如何表示我们的类图( 见图 4)。...在模型之间创建关系的一种方法是使用 ForeignKey字段。它将在模型之间创建链接并在数据库级别创建适当的关系。该 ForeignKey字段需要一个位置参数,其中包含对其将相关的模型的引用。...例如,在 Topic模型中,board字段是 ForeignKey给 Board模型。它告诉 Django 一个 Topic实例只与一个 Board实例相关。
如果存在将特定的Child链接到每个Parent的关系,假设它称为Child.parents,SQLAlchemy 默认将加载Child.parents集合以定位所有Parent对象,并从建立此链接的“...然后,两个独立的 relationship() 构造将首先父侧通过一对多连接到映射的关联类,然后通过多对一将映射的关联类连接到子侧,以形成从父对象到关联对象到子对象的单向关联对象关系。...Parent到Child有一个relationship(),但是没有将特定的Child链接到每个Parent的反向关系,SQLAlchemy 不会意识到删除此特定Child对象时需要维护链接到Parent...如果存在将特定的Child链接到每个Parent的关系,假设它被称为Child.parents,SQLAlchemy 默认会加载Child.parents集合以定位所有Parent对象,并从建立此链接的...然后,两个独立的relationship()构造首先通过一对多将父侧链接到映射的关联类,然后通过多对一将映射的关联类链接到子侧,以形成从父对象到关联对象到子对象的单向关联对象关系。
ForeignKey.related_name 这个名称用于让关联的对象反查到源对象. 如果你不想让Django 创建一个反向关联,请设置related_name 为 '+' 或者以'+' 结尾....ForeignKey.related_query_name以ForeignKey.related_name作为默认值 使用ForeignKey查询 前向查询 若关系模型A包含与模型B关联的关联字段, 模型...A的实例可以通过关联字段访问与其关联的模型B的实例: >>> e = Entry.objects.get(id=2) >>> e.blog # Returns the related Blog object...被索引的关系模型可以访问所有参照它的模型的实例,如Entry.blog作为Blog的外键,默认情况下Blog.entry_set是包含所有参照Blog的Entry示例的查询集,可以使用查询集API取出相应的实例...具有相似的API.
前向查询 如果一个模型具有 ForeignKey,那么该模型的实例将可以通过属性访问关联的(外部)对象。...对外键的修改不会保存到数据库中,直至调用 save()。...反向查询 如果模型 1 有一个 ForeignKey,那么该 ForeignKey 所指向的模型 2 实例可以通过一个管理器 返回前面有 ForeignKey 的模型 1 的所有实例。...# 例如:Student 模型改成 department = models.ForeignKey('Department', related_name='student'),那么实例代码改成这样 处理关联对象的其他方法...从关联的对象集中删除指定的模型对象。(多对多) 删除的是关系表中的数据 clear() 从关联的对象集中删除所有的对象。
然而,遗留的Query对象,它执行与这些步骤相同的操作,更像是一个“一体化”的对象,仍然作为对这个新系统的薄外观保持可用,以支持在 1.x 系列上构建的应用程序,而无需对所有查询进行全面替换。...连接到具有 ON 子句的目标 第三种调用形式允许目标实体以及 ON 子句都明确传递。...()` 绑定属性还提供了一些 SQL 构造实现,这些实现旨在根据相关对象的特定实例来过滤 `relationship()` 绑定属性,该实例可以从给定的 持久化(或不太常见的 分离)对象实例中拆解适当的属性值...+ **多对一等于比较** - 可以将特定对象实例与多对一关系进行比较,以选择目标实体的外键与给定对象的主键值匹配的行: ```py >>> user_obj = session.get...+ **一对多等于比较** - 可以将特定对象实例与一对多关系进行比较,以选择外键与给定对象的主键值匹配的行: ```py >>> user_obj = session.get(User
,链接到类的 Properties 实例。...在上述代码中,即使我们的应用程序可能多次调用 search_for_user(),即使在每次调用中我们都建立一个全新的 BakedQuery 对象,所有的 lambda 只调用一次。...这样,QueryEvents.before_compile()挂钩可以在每次使用特定Query时被调用,以适应每次以不同方式修改查询的挂钩。...在上述代码中,即使我们的应用程序可能多次调用search_for_user(),即使在每次调用中我们都会构建一个全新的BakedQuery对象,所有的 lambda 函数只会被调用一次。...为了消除所有开销,我们需要缓存查询的构建以及 SQL 编译。假设我们按照这种方式调整了配方,并制作了一个.bake()方法,用于预先编译查询的 SQL,生成一个可以以最小开销调用的新对象。
尽管在 SQL 查询中评估其流畅性时修改的先序具有吸引力,但邻接列表模型可能是满足大多数层次存储需求的最合适模式,原因是并发性、减少的复杂性,以及修改的先序对于能够完全加载子树到应用程序空间的应用程序几乎没有优势...SQLAlchemy 的连接和子查询急切加载在连接到相关项时在所有情况下使用别名表,因此与自引用连接兼容。...为了组织关系的构建以解决这些问题,可以使用像MapperEvents.before_mapper_configured()这样的配置级事件钩子,该钩子仅在所有映射准备好进行配置时才会调用配置代码: from...为了组织关系的构建以解决这些问题,可以使用配置级别的事件钩子,如 MapperEvents.before_mapper_configured(),该钩子将仅在所有映射准备好配置时调用配置代码: from...集合发生变化时,通过事件钩子来以编程方式应用过期。
在所有情况下,对于给定行要实例化的最终类由基类上定义的鉴别器列或 SQL 表达式确定,该列将生成与特定子类关联的标量值。...具有唯一于该类的属性的特定子类将在表中的列中保留它们,如果行引用了不同类型的对象,则这些列将为空。...## 具体表继承 具体继承将每个子类映射到其自己的独立表,每个表包含产生该类实例所需的所有列。具体继承配置默认以非多态方式查询;对于特定类的查询将仅查询该类的表,并且仅返回该类的实例。...在所有情况下,给定行的最终实例化类由基类上定义的鉴别器列或 SQL 表达式确定,该列将产生与特定子类关联的标量值。...具有特定类别属性的特定子类将在表中的列中保留它们,如果行引用不同类型的对象,则列中将为空。
部分迁移到 2.0 步骤六 - 为显式类型的 ORM 模型添加 allow_unmapped 说明了如何为使用显式注释的遗留 ORM 模型临时禁用这些错误的触发。...无论如何,Table对象永远不应该具有两个或更多具有相同名称的Column对象,无论它们有什么.key。已经确定并修复了一个仍然可能发生这种情况的边缘情况。...而以前的Variant方法能够通过动态属性获取器维护原始类型的所有 Python 行为,这里的改进是当调用变体时,返回的类型仍然是原始类型的实例,这与 mypy 和 pylance 等类型检查器更加顺畅地配合...虽然以前的Variant方法能够使用动态属性获取器保持原始类型的所有 Python 行为,但这里的改进是,调用变体时,返回的类型仍然是原始类型的实例,这更顺畅地与类型检查器如 mypy 和 pylance...无论如何,Table 对象都不应该具有两个或更多具有相同名称的 Column 对象,无论它们的 .key 如何。已经确定并修复了仍然可能发生此情况的边缘情况。
领取专属 10元无门槛券
手把手带您无忧上云