换言之,models,manager和queryset是我们和数据库交互必须的三个东西。...实际上由于“一个模型类的实例代表数据库表中的一行记录”,因此模型类的实例是不能起到查询数据的功能。 Manager 因此,我们要从数据库检索到数据,ORM就必须提供相应的方法。...不过,若你想将 objects 用作字段名,或想使用 objects 以外的 Manager 名字,就要在模型基类中重命名。...在 SQL 的层面上, QuerySet 对应 SELECT 语句,而filters对应类似 WHERE 或 LIMIT 的限制子句。...需要注意的是Managers 只能通过模型类访问,而不是通过模型实例,目的是强制分离 “表级” 操作和 “行级” 操作。 什么时候QuerySet被执行?
然而,如果你想将objects用于字段名称,或者你想使用其它名称而不是objects访问管理器,你可以在每个模型类中重命名它。...Django 会将模型中定义的管理器解释为默认的 管理器,并且 Django 中的一部分应用(包括数据备份)会使用默认的管理器,除了前面那个模型。...下面就是 Django 如何处理自定义管理器和模型继承(model inheritance)的: 定义在非抽象基类中的管理器是 不会 被子类继承的。...在整个这一节中,我们将那种由 Django 为你创建的管理器称之为 “自动管理器”,既有因为没有管理器而被 Django 自动添加的默认管理器, 也包括在访问关联模型时使用的临时管理器。...设置 use_for_related_fields use_for_related_fields属性必须在管理器类中设置,而不是在类的 实例中设置。
values() 返回包含对象具体值的字典的QuerySet values_list() 与values()类似,只是返回的是元组而不是字典。...7. values() values(fields, *expressions) 返回一个包含数据的字典的queryset,而不是模型实例。...('pizzas__toppings') 这将预取所有属于餐厅的比萨饼,和所有属于那些比萨饼的配料。...唯一限制是它只能更新模型主表中的列,而不是关联的模型,例如不能这样做: >>> Entry.objects.update(blog__name='foo') # Won't work!...update(),而不是将模型对象加载到内存中。
在 Django 中我们通常会使用 selected_related 或prefetch_related 来预取关联对象,来减少和 DB 之间的交互,但是在使用上也需要有一些注意的地方。...首先,预取需要精确控制到字段。 Django 默认的查询方式都是粗放的,例如普通查询不使用 values 或者 only 时都是 select * ,而预取也不例外,看看下面这个例子。...此外,我们还会遇到级联预取的场景。 class Foo(models.Model): ......此时在后续的循环处理中,我们需要通过 Foo 对象查询到 Baz 的数据,为了避免 N + 1 我们也会多级预取: Foo.objects.filter().select_related("bars")...("large_config")) ) 是不是觉得 ORM 查询本身也挺繁杂的?
0909自我总结 drf框架中所有视图及用法 一.drf框架中的所有视图类 from django.views import View from rest_framework import views,...generics, mixins, viewsets 最基础:django自带的views类 drf框架中最基础的视图类:views.APIView drf框架中工具视图:generics GenericAPIView...:该视图类中的基类 mixins视图工具集: RetrieveModelMixin:retrieve 单取 ListModelMixin:list 群取 CreateModelMixin:create...:与模型类无关或不是标准模型类接口 - 一般都是自定义功能 三.generics中GenericAPIView使用 将 queryset 和 serializer_class 封装成类属性,提供了三个方法...queryset serializer_class 如果我们要使用get_object()必须前端传给我们一个pk 四.mixins使用 mixins是在generics再进行方法的分装成5个方法 RetrieveModelMixin
有关拾取QuerySet的详细信息,请参阅下一节。在本节中,从数据库中读取结果非常重要。 repr()调用repr()时,将执行QuerySet。...这意味着当取消缓存QuerySet时,它包含缓存时的结果,而不是数据库中当前的结果。 如果只想提取将来从数据库中重新创建QuerySet所需的信息,请提取QuerySet的查询属性。...QuerySet类具有以下公共属性,可用于内省: 有序 True如果QuerySet是有序的–有一个order_by()子句或模型的默认排序。否则,这是错误的。...表达式可以是简单值、对模型(或任何相关模型)字段的引用,或计算与QuerySet中的对象相关的对象的聚合表达式(平均值、总和等)。...使用关键字参数指定的注释使用关键字作为注释的别名。匿名参数将根据聚合函数的名称和聚合模型字段为其生成别名。只有引用单个字段的聚合表达式才能成为匿名参数。其他所有内容都必须是关键字参数。
=True, verbose_name=u'标题') 理解QuerySets 理解QuerySet的求值过程 QuerySets是惰性的 news_list = News.object.all() #... {% endif %} {% endwith %} {% endif %} 它是最优的是因为: 因为QuerySet是惰性的,如果 'display_inbox' 是False的话...QuerySet.delete() 批量操作不会调用类中定义的 save() 或 delete() 方法 直接使用外键的值 获取频道ID: news.channel_id 而不是: news.channel.id...Entry.objects.bulk_create([ Entry(headline="Python 3.0 Released"), Entry(headline="Python 3.1 Planned") ]) ...而不是...Entry.objects.create(headline="Python 3.1 Planned") 这同样适用于 ManyToManyFields, 因此,这么做 team.members.add(me, my_friend) ...而不是这么做
当设置了model_name时,hints 通常通过键’model‘包含该模型的类。注意,它可能是一个历史模型,因此不会有自定的属性、方法或管理器。你应该只依赖_meta。...因为create_user()是一个管理器方法,不是一个QuerySet方法,你不可以使用User.objects.using('new_users').create_user()。...(create_user() 方法只能在User.objects上使用,而不能在从管理器得到的QuerySet上使用)。...为了保持两个对象之间的关联,Django 需要知道关联对象的主键是合法的。如果主键存储在另外一个数据库上,判断一个主键的合法性不是很容易。...(包括不是存储在同一个数据库中的模型)。
决定你的优先级是什么,是你自己的事情,你必须要权衡利弊,按需使用它们,因为这取决于你的应用和服务器。...在数据库中而不是Python中做数据库的工作 比如: 在最基础的层面上,使用过滤器和反向过滤器对数据库进行过滤。 使用F 表达式在相同模型中基于其他字段进行过滤。 使用数据库中的注解和聚合。..., 以及在适当的管理器和默认管理器中。...使用QuerySet.update()和delete() 通过QuerySet.update()使用批量的SQL UPDATE语句,而不是获取大量对象,设置一些值再单独保存。...例如,执行: entry.blog_id 而不是: entry.blog.id 不要做无谓的排序 排序并不是没有代价的;每个需要排序的字段都是数据库必须执行的操作。
(4)unique 如果该值设置为 True, 这个数据字段的值在整张表中必须是唯一的 (5)choices 由二元组组成的一个可迭代对象(例如,列表或元组),用来给字段提供选择项。...如果设置了choices ,默认的表单将是一个选择框而不是标准的文本框,而且这个选择框的选项就是choices 中的选项。...就像是一个Book表的管理器一样,提供了增删改查所有的方法 print(book_obj.title) #可以基于这个对象来取这个新添加的记录对象的属性值 dic1 = {'title':'linux...,并且这几个条件必须都成立,是and的关系,or关系的我们后面再学,直接在这里写是搞不定or的 get(**kwargs): 返回与所给筛选条件相匹配的对象,不是queryset...().exists() #翻译成的sql是SELECT (1) AS `a` FROM `app01_book` LIMIT 1,就是通过limit 1,取一条来看看是不是有数据 values
(ORM)中,数据库与 python 对象的映射关系十分形象,一个表模型类(class)即代表一张表,实例化出一个对象即代表一条数据记录 创建一个对象(一条数据记录) 在 django 中要想创建一个数据对象...Retrieving objects 查出对象(QuerySet) 从数据库中查询对象,通过 表模型类的 Manager 管理器 来构造一个 QuerySet 。...." --> Manager 不能通过 Blog 实例来访问 注意: Managers 只能通过表模型类来访问,而不是模型类的实例(对象) 请你一定要分清楚你当前使用的是 表层面 的操作还是 记录层面...,如果 Entry 对应的表中没有任何对象符合 主键 是 1,那么 django 将会报错:Entry.DoesNotExist。...对象的方法 下面这些 QuerySet 方法会直接触发数据库操作然后返回一些其他东西,而不是 QuerySet 这些方法不会使用 cache 缓存,相反,每次调用他们都会执行数据库操作 # 常见的几个
在Django MVC概述和开发流程中已经讲解了Django的MVT开发流程,本文重点对MVT中的模型(Model)进行重点讲解。 配置MySQL数据库 确保已经安装了操作mysql的包。...字段类型 Django中每个模型类都会被映射为数据表,而模型类属性则被映射为数据表中的字段。...默认值是False,若为True,则该字段会成为模型的主键字段,一般作为AutoField的选项使用。 unique 唯一约束。默认值是False,如果为True, 这个字段在表中必须有唯一值。...all 返回模型类对应表格中的所有数据。 QuerySet对象 aggregate 无参数 filter 返回表中满足条件的数据。 QuerySet对象 参数为查询条件。...每个模型类都有objects对象,这是Django自动生成的管理器对象,通过这个管理器可以实现对数据的查询。
我们已经编写了博客数据库模型的代码,但那还只是 Python 代码而已,Django 还没有把它翻译成数据库语言,因此实际上这些数据库表还没有真正的在数据库中创建。...Django 用来记录我们对模型做了哪些修改的文件。...然后我们根据用户名和分类名,通过 get 方法取出了存在数据库中的 User 和 Category(取数据的方法将在下面介绍)。...是我们的模型管理器,它为我们提供一系列从数据库中取数据方法,这里我们使用了 all 方法,表示我们要把对应的数据全部取出来。...此外我们在创建文章时提到了通过 get 方法来获取数据,这里 all 方法和 get 方法的区别是:all 方法返回全部数据,是一个类似于列表的数据结构(QuerySet);而 get 返回一条记录数据
myapp_modelName,是根据 模型中的元数据自动生成的,也可以覆写为别的名称 2、id 字段是自动添加的 3、对于外键字段,Django 会在字段名上添加"_id" 来创建数据库中的列名...(4)unique 如果该值设置为 True, 这个数据字段的值在整张表中必须是唯一的 (5)choices 由二元组组成的一个可迭代对象(例如,列表或元组),用来给字段提供选择项。...如果设置了choices ,默认的表单将是一个选择框而不是标准的文本框,而且这个选择框的选项就是choices 中的选项。...注意: 第二种方式修改不能用get的原因是:update是QuerySet对象的方法,get返回的是一个model对象,它没有update方法,而filter返回的是一个QuerySet对象(filter...(例如,遍历 QuerySet,在每个对象上调用 delete()方法),而不是使用 QuerySet 中的 delete()方法。
同样的,DRF对外操作的其他接口,如查询,修改操作,就不允许找到已经软删除的数据。 自带的Admin 既然是超级管理后台,那么就允许操作任何数据,包括已经软删除的,而不是列表找不到软删除的数据。...简而言之: drf找不到删除的数据,admin需要全部数据 drf和admin删除数据都是软删除 解决方案 DRF Django Manager 赋予了 Django的模型(Model)中操作数据库的能力...也就是如:Book.objects.all()中的objects。有没有想过它到底是什么? 显然,默认的模型Manager并不能解决我们的问题,所以我们需要自定义模型的Manager。...objects = ModelManager() 不仅如此,刚刚只是过滤了软删除数据,我们还需要将接口删除的操作,进行软删除,而不是真删除。...由于我们已经在模型层通过Manager直接改变了最初的数据过滤后的样子,这里怎么重写也是无事于补的。 于是我在想,那就在定义一个模型管理器,在Admin中使用这个管理器不就好了?
注意 管理器通常只可以通过模型类来访问,不可以通过模型实例来访问。这是为了强制区分表级别和记录级别的操作。 对于一个模型来说,Manager是QuerySet的主要来源。...因为过滤项过滤的是 Blog,而不是 Entry。...,QuerySet 中的 delete() 方法都只使用一条 SQL 语句一次性删除所有对象,而并不是分别删除每个对象。...(例如,遍历 QuerySet,在每个对象上调用 delete()方法),而不是使用 QuerySet 中的 delete()方法。...建议的方式是在你的 model 自定义方法或是自定义 model 的 manager 方法来运行查询。虽然 Django 不要求数据操作必须在 model 层中执行。
1.自定义管理器(Manager) 在语句Book.objects.all()中,objects是一个特殊的属性,通过它来查询数据库,它就是模型的一个Manager....,Book.objects.all()将返回数据库中的所有书籍,而Book.dahl_objects.all()只返回作者是Roald Dahl的书籍.注意我们明确的将objects设置为默认Manger...因为覆盖get_queryset()了,你可能接受到一个无用的返回对像,你必须避免这种情况. 2.自定义模型方法 为了给你的对像添加一个行级功能,那就定义一个自定义方法.鉴于manager经常被用来用一些整表操作...同样重要的是,您要传递可以传递给模型方法的参数——这就是*args, **kwargs所做的事情。Django将不时扩展内置模型方法的功能,并添加新的参数。...上面的示例中,clean()引发的ValidationError异常通过一个字符串实例化,所以它将被保存在一个特殊的错误字典中,键为NON_FIELD_ERRORS.这个键用于整个模型出现的错误而不是一个特定字段穿线的错误
要更新一个值,我们可以这样做: board.description = 'Django discussion board.' board.save() 每个 Django 模型都有一个特殊的属性;我们称之为模型管理器...>]> 结果是一个QuerySet 。...同样,我们可以使用模型管理器 查询数据库并返回单个对象。...models操作总结 下面是我们在本节中学习的方法和操作的摘要,使用Board 模型作为参考。...大写的Board 指的是类,小写的board 指的是Board 模型类的一个实例(或对象): Operation 代码示例 创建对象而不保存 board = Board() 保存对象(创建或更新) board.save
,运行后得到的并不是一系列model的实例化对象,而是一个可迭代的字典序列 values_list(*field): 它与values()非常相似,它返回的是一个元组序列,values返回的是一个字典序列...("book__title") ManyToManyField class RelatedManager "关联管理器"是在一对多或者多对多的关联上下文中使用的管理器。...')) Django 支持 F() 对象之间以及 F() 对象和常数之间的加减乘除和取模的操作。...同时,Q 对象可以使用~ 操作符取反,这允许组合正常的查询和取反(NOT) 查询。 示例:查询作者名字是小仙女并且不是2018年出版的书的书名。...所有提供给查询函数的参数(关键字参数或Q 对象)都将"AND”在一起。但是,如果出现Q 对象,它必须位于所有关键字参数的前面。 例如:查询出版年份是2017或2018,书名中带物语的所有书。
(*field): 返回一个ValueQuerySet——一个特殊的QuerySet,运行后得到的并不是一系列model的实例化对象,而是一个可迭代的字典序列 values_list..."是在一对多或者多对多的关联上下文中使用的管理器。...')) Django 支持 F() 对象之间以及 F() 对象和常数之间的加减乘除和取模的操作。...同时,Q 对象可以使用~ 操作符取反,这允许组合正常的查询和取反(NOT) 查询。 示例:查询作者名字是小仙女并且不是2018年出版的书的书名。...所有提供给查询函数的参数(关键字参数或Q 对象)都将"AND”在一起。但是,如果出现Q 对象,它必须位于所有关键字参数的前面。 例如:查询出版年份是2017或2018,书名中带物语的所有书。
领取专属 10元无门槛券
手把手带您无忧上云