所以,类和实例都会有同名的静态与对象成员title哦。...所以我们需要一个容器,保存着SQL操作返回的全部Article实例,它就是models.QuerySet。...例如: Article.objects.filter(title=’xxx’).filter(type=1).distinct() 同时,QuerySet对象还具有“懒执行”的效果,只要没有真的使用查询出的行中数据时...所以,我们自然也可以由type隐式得生成类,type生成类的方式如下: cls = type(name, base, attrs) name也就是类名,base是基类,而attrs就是属性,所有的成员和方法都在其中...这里要插一句:python使用meta元类的规则是首先在当前类中查找是否使用元类,如果没有,再依次去父类中查看是否使用元类,若查找到显式指定的元类,则直接使用该元类创建类,若未找到,则使用默认的type
如果你想只用一条语句创建并保存一个对象,使用create()方法。 保存对象的改动 调用save()方法,来保存已经存在于数据库中的对象的改动。...保存ForeignKey和ManyToManyField字段 更新ForeignKey字段的方式和保存普通字段相同–只是简单地把一个类型正确的对象赋值到字段中。...与 entry 相关联,Django 会认为它没有 name 属性,而不会因为不存在 author 抛出异常。...在 QuerySet 进行更新时,唯一的限制就是一次只能更新一个数据表,就是当前 model 的主表。所以不要尝试更新关联表和与此类似的操作,因为这是不可能运行的。...你可以设置和获得外键属性。正如你所期望的,改变外键的行为并不引发数据库操作,直到你调用 save()方法时,才会保存到数据库。
其实模型名字.objects是一个django.db.models.manager.Manager对象,而Manager这个类是一个“空壳”的类,他本身是没有任何的属性和方法的。...如果在values中没有传递任何参数,那么将会返回这个恶模型中所有的属性。 values_list:类似于values。只不过返回的QuerySet中,存储的不是字典,而是元组。...create:创建一条数据,并且保存到数据库中。这个方法相当于先用指定的模型创建一个对象,然后再调用这个对象的save方法。...first和last:返回QuerySet中的第一条和最后一条数据。 aggregate:使用聚合函数。 exists:判断某个条件的数据是否存在。...说明上面的QuerySet并没有真正的执行。 在以下情况下QuerySet会被转换为SQL语句执行: 迭代:在遍历QuerySet对象的时候,会首先先执行这个SQL语句,然后再把这个结果返回进行迭代。
其实模型名字.objects是一个django.db.models.manager.Manager对象,而Manager这个类是一个“空壳”的类,他本身是没有任何的属性和方法的。...默认情况下会把表中所有的字段全部都提取出来,可以使用values来进行指定,并且使用了values方法后,提取出的QuerySet中的数据类型不是模型,而是在values方法中指定的字段和值形成的字典:...如果在values中没有传递任何参数,那么将会返回一个字典,字典中包含这个模型中所有的属性。...create create:创建一条数据,并且保存到数据库中。这个方法相当于先用指定的模型创建一个对象,然后再调用这个对象的save方法。...first和last first和last:返回QuerySet中的第一条和最后一条数据 aggregate aggregate:使用聚合函数。
Django的Manager和QuerySet 要从数据库检索对象,需要通过模型类的 Manager 构建一个 QuerySet。...换言之,models,manager和queryset是我们和数据库交互必须的三个东西。...models本身没有什么需要多说的,Django 使用了一套直观的系统:一个模型类代表一张数据表,一个模型类的实例代表数据库表中的一行记录。 模型类的save方法可以插入,更新,删除数据。...同理,如果只想知道一个是否存在,可以使用QuerySet的 exences()方法,这比查询出对象本身更高效一些。 3. QuerySet可以被切片,但是不能使用负数索引。...QuerySet 类具有两个可用于自省的公开属性: 可以返回QuerySet对象的QuerySet方法 前文所述的看起来做了3次SQL查询,实际上只有一次。
模板语法 模版文件中使用的variables会被上下文字典中的对应的key的值所替代。 模版文件中使用的tags会被引擎执行一段相应的逻辑。...load同时也会导入tag和filter 过滤器和功能tag的区别 Tags的功能比filter要复杂的多,因为tag几乎可以做任何事情,包括最重要的渲染模版inclusion_tag。...还有load后面的自定义tag保存的文件,不用引号,直接load后面跟文件名就行了 在模版中使用自定义tag和filter。...有没有什么方法不用继承模版就可以实现相同页面块的即插即用(继承方式无法即插即用)。...article_archive_queryset': article_archive_queryset,} 使用我们的inclusion_tag了,将my_tags_filters.py 放入到app目录下的
在这个投票应用中,我们将创建两个模型: Question和Choice。Question对象具有一个question_text(问题)属性和一个publish_date(发布时间)属性。...在处理字段名的引号时也是如此 —— 例如,使用双引号还是单引号; sqlmigrate命令并不会在你的数据库上真正运行迁移文件 —— 它只是把Django 认为需要的SQL打印在屏幕上以让你能够看到...Django: >>> import django >>> django.setup() 如果以上命令引发了一个AttributeError,可能是你使用了一个和本教程不匹配的Django版本。...choice集合,目前是空的,还没有任何关联对象。...在页面的底部,则是一些可选项按钮: Save —— 保存更改,并返回当前类型对象的变更列表界面; Save and add another:保存当前修改,并加载一个新的空白的当前类型对象的表单
get_object 方法通常情况下依据以下两点来筛选出单个资源对象: get_queryset 方法(或者 queryset 属性,get_queryset 方法返回的值优先)返回的资源列表对象。...lookup_field 属性指定的资源筛选字段(默认为 pk)。django-rest-framework 以该字段的值从 get_queryset 返回的资源列表中筛选出单个资源对象。...类似于视图集类的 queryset 属性和 get_queryset 方法的关系, serializer_class 属性的值也可以通过 get_serializer_class 方法返回的值覆盖,因此我们可以根据不同的...省略其他属性和方法 def get_serializer_class(): if self.action == 'list': return PostListSerializer...更好的做好是,给视图集加一个属性,用于配置 action 和 serializer_class 的对应关系,通过查表法查找 action 应该使用的序列化器。
同理,如果我想查询所有含有python这个tag的文章,可以这样编写queryset: Collection.objects.filter(detail__tags__contains='django'...__contains='django') 这个queryset中,__tags是transform,而__contains是lookup。...那么,在JSONField中,lookup实际上是没有变的,但是transform从“在外键表中查找”,变成了“在JSON对象中查找”,所以自然需要重写get_transform函数。...可见,已注入单引号导致SQL报错。...原因是,Django-Admin中就支持用户控制queryset的查询键名,我在2017年在微博中说到过这一点,不过当时没有测过JSONField,sad。 ?
使用 objects 属性操作数据库,objects 是模型中实际和数据库进行交互的 Manager 类的实例化对象 4....类型 Student.objects.all() # 如果要取出所有QuerySet类型中的所有数据对象,需要遍历取出所有的对象,再用对象.属性来查看值 s = Student.object.all(...(age=18) 添加数据 对象 = 类() # 使用类实例化对象 对象.属性 = 值 # 给对应的对象的属性赋值 对象.save() # 必须要执行保存操作,否则数据没有进入数据库 # python3...Student() # 给对象的属性赋值 s.name = 'ruochen' s.address = 'xxx' s.phone = '18888888888' s.age = 18 # 保存数据...,比如上边的例子就是在Teacher的表格里进行定义 add 跟一对一方法类似,通过create和new来添加 create:把属性都填满,然后不需要手动保存 new: 可以属性或者参数为空,必须用save
基本用法2.1 创建Beautiful Soup对象要使用Beautiful Soup解析文档,首先需要创建一个Beautiful Soup对象。...pythonCopy code# 选择所有的标签p_tags = soup.select('p')# 选择所有的标签a_tags = soup.select('a')3.2 类和ID选择器使用类和...'的标签main_content_tag = soup.select('#main-content')3.3 属性选择器可以使用属性选择器来选择具有特定属性值的标签。...pythonCopy codetry: # 尝试获取某个标签 tag = soup.find('some_tag') print(tag.text)except AttributeError...保存和加载解析树Beautiful Soup可以将解析树保存为字符串,也可以从字符串加载解析树。
选择数据库版本 我们没有安装任何的数据库软件,Django 就帮我们迁移了数据库。这是因为我们使用了 Python 内置的 SQLite3 数据库。...用 Django 的方式操作数据库 数据库最主要的操作就是往里面存入数据、从中取出数据、修改已保存的数据和删除不再需要的数据。...允许为空 excerpt、tags 我们就没有为它们指定值了。 注意:我们这里使用 get 方法根据 Category 的 name 属性的值获取分类的一条记录。...test 到分类,修改它的 name 属性为新的值 category test new,然后调用 save 方法把修改保存到数据库,之后可以看到数据库返回的数据已经是修改后的值了。...delete 方法,最后看到 Post.objects.all() 返回了一个空的 QuerySet(类似于一个列表),表明数据库中已经没有 Post,Post 已经被删除了。
在前面教程中小编我已经介绍了Django的Queryset特性及高级使用技巧以及Queryset的aggregate和annotate方法。...当我们使用Article.objects.all()查询文章时,我们做了第一次数据库查询,查询的是blog_article数据表, 得到的数据只是文章对象列表,然而并没有包含与每篇文章相关联的category...和tags对象信息。...我们可以使用Prefetch方法给prefect_related方法添加条件和属性。...使用Prefetch方法可以给prefetch_related方法额外添加额外条件和属性。
Experimenting with the Models API 使用 Python 进行开发的一大优势是交互式 shell。我用它所有的时间。这是一种快速尝试和试验库和 API 的方法。...这意味着我们可以导入我们的模型和项目中的任何其他资源并使用它。...要将这个对象持久保存在数据库中,我们必须调用该 save方法: board.save() 该 save方法用于创建 和更新 对象。...这里 Django 创建了一个新对象,因为Board 实例没有id 。...基本上,它是来自数据库的对象列表。我们可以看到我们有两个对象,但是我们只能读取Board object 。那是因为我们还没有 __str__在Board 模型中定义方法。
五个扩展类 1.ListModelMixin 2.CreateModelMixin 3.RetrieveModelMixin 4.UpdateModelMixin 5.DestroyModelMixin 二、使用案例...该Mixin的list方法会对数据进行过滤和分页。...BookSerializer class BooksMixinView(ListModelMixin, CreateModelMixin, GenericAPIView): """ 获取所有图书和保存图书...""" # 指定查询集属性 queryset = BookInfo.objects.all() # 指定序列化器 serializer_class = BookSerializer...create(request, *args, **kwargs) 如果创建了一个对象,这将返回一个响应,并将该对象的序列化表示形式作为响应的主体。如果表示形式包含名为 的键,则响应的标头将填充该值。
people = models.Manager() 使用例子中的模型, Person.objects会抛出AttributeError异常,而Person.people.all()会返回一个包含所有Person...例如,下面这个自定义的 管理器提供了一个 with_counts() 方法,它返回所有 OpinionPoll 对象的列表,而且列表中的每个对象都多了一个名为 num_responses的属性,这个属性保存一个聚合查询...由于 get_queryset() 返回的是一个 查询集 对象,所以你仍可以对它使用 filter(), exclude()和其他 查询集的方法。...from_queryset classmethod from_queryset(queryset_class) 在进一步的使用中,你可能想创建一个自定义管理器和一个自定义查询集。...这是因为,管理器被设计用来封装对象集合管理的逻辑。由于抽象的对象中并没有一个集合,管理它们是毫无意义的。如果你写了应用在抽象模型上的功能,你应该把功能放到抽象模型的静态方法,或者类的方法中。
保存外键字段或多对多字段(ForeignKey or ManyToManyField fields) 外键字段 ForeignKey 更新一个外键字段的写法和普通字段的完全一致,只需要将正确类型的对象分配给相关字段即可...,下面的语句是更新一个 Entry 模型类实例化出来的 entry 对象的 blog 属性(请确保下面用到的 Entry 和 Blog 的实例化对象已经存在在数据库中,这样我们的语句才能将它们查出来)...(对象赋值给字段) entry.save() # 调用 .save() 方法 ManyToManyField 想要保存多对多字段,写法和外键字段有点小区别,使用 .add() 方法来记录一个关系。...记住这个 使用 .get() 和 .filter()[0] 有点不一样,如果没有满足条件的查询结果, .get() 会报一个 DoesNotExist 的错,这个报错是执行的表模型类的一个属性,所以,在上面的代码中...--> 推测是 遍历、取值,翻译成取值好像更合适一点) alias 别名 特别点 保存外键字段那里,可以直接给外键对象赋值一个对象(blog 对象 --> blog 属性) cache
一 QuerySet 可切片 使用Python 的切片语法来限制查询集记录的数目 。它等同于SQL 的LIMIT 和OFFSET 子句。...总结: queryset的cache是用于减少程序对数据库的查询,在通常的使用下会保证只有在需要的时候才会查询数据库。 使用exists()和iterator()方法可以优化程序对内存的使用。...对于一对一字段(OneToOneField)和外键字段(ForeignKey),可以使用select_related 来对QuerySet进行优化。...select_related 返回一个QuerySet,当执行它的查询时它沿着外键关系查询关联的对象的数据。它会生成一个复杂的查询并引起性能的损耗,但是在以后使用外键关系时将不需要数据库查询。...简单说,在对QuerySet使用select_related()函数后,Django会获取相应外键对应的对象,从而在之后需要的时候不必再查询数据库了。
本系列为Python基础学习,原稿来源于github英文项目,大奇主要是对其本地化翻译、逐条验证和补充,想通过30天完成正儿八经的系统化实践。此系列适合零基础同学,会简单用但又没有系统学习的使用者。...AttributeError AttributeError表示属性错误。一般是某个声明的对象没有此属性,但却被引用进而引发的错误。...我尝试从数学模块调用pi函数,而不是pi。因此会引发一个AttributeError错误,这意味着该函数在模块中不存在。我们将PI改成pi来修正它。...>>> import math >>> math.pi 3.141592653589793 >>> 现在,我们从math模块中正确使用属性,因此我们得到圆周率的结果。...本次没有额外的作业,但如果上边的例子,你并没有亲自尝试,那么请你把他们当作练习完成错误见证和debug修复它们。Y 第15天练习 打开python交互式shell并练习本节中介绍的所有示例。
QuerySet 可切片 使用Python 的切片语法来限制查询集记录的数目 。它等同于SQL 的LIMIT 和OFFSET 子句。...总结: queryset的cache是用于减少程序对数据库的查询,在通常的使用下会保证只有在需要的时候才会查询数据库。 使用exists()和iterator()方法可以优化程序对内存的使用。...对于一对一字段(OneToOneField)和外键字段(ForeignKey),可以使用select_related 来对QuerySet进行优化。...简单说,在对QuerySet使用select_related()函数后,Django会获取相应外键对应的对象,从而在之后需要的时候不必再查询数据库了。...也可以通过使用双下划线“__”连接字段名来实现指定的递归查询。 没有指定的字段不会缓存,没有指定的深度不会缓存,如果要访问的话Django会再次进行SQL查询。
领取专属 10元无门槛券
手把手带您无忧上云