python2----Django----笔记
Posted wang-sir
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python2----Django----笔记相关的知识,希望对你有一定的参考价值。
1入门:
1.1环境搭建 1.2设计模型 1.3管理站点 1.4视图 1.5模板 总结与作业:
2模型:
2.1定义模型 2.2模型成员 2.3模型查询 2.4自连接 总结与作业:
3视图:
3.1URL config 3.2视图函数 3.3Request对象 3.3.1QueryDict对象 3.3.2GET属性 3.3.3POST属性 3.4Response对象 3.5状态与保持 总结与作业:
4模板:
4.1定义模板 4.2模型继承 4.3HTML转义 4.4CARF 4.5验证码 总结与作业:
5高级:
5.1静态文件处理 5.2中间件 5.3上传图片 5.4admin站点 5.5分页 5.6ajax 总结与作业:
6第三方:了解
6.1富文本编辑器 6.2缓存 6.3全文检索 6.4celery 6.5部署 总结与作业:
7Git与项目:
71远程仓库、本地仓库 7.2项目设计 7.3项目类设计 7.4使用页面 7.5总结与作业:
------------------------------------------------------------------------------------------
1.1:
创建虚拟环境 创建:mkvirtualenv [虚拟环境名称] 删除:rmvirtualenv [虚拟环境名称] 进入:workon [虚拟环境名称] 退出:deactivate 所有的虚拟环境,都位于/home/.virtualenvs目录下 进入虚拟环境前的提示: 入虚拟环境前的提示 进入虚拟环境后的提示: 进入虚拟环境后的提示 查看当前的所有虚拟环境:workon [两次tab键] 查看虚拟环境中已经安装的包 pip list pip freeze 安装django 建议安装1.8.2版本,这是一个稳定性高、使用广、文档多的版本 pip install django==1.8.2 查看版本:进入python shell,运行如下代码 import django django.get_version() 说明:使用pip install django命令进行安装时,会自动删除旧版本,再安装新版本 创建项目 命令django-admin startproject test1 进入test1目录,目录结构如下图: 默认目录结构 目录说明 manage.py:一个命令行工具,可以使你用多种方式对Django项目进行交互 内层的目录:项目的真正的Python包 _init _.py:一个空文件,它告诉Python这个目录应该被看做一个Python包 settings.py:项目的配置 urls.py:项目的URL声明 wsgi.py:项目与WSGI兼容的Web服务器入口
1.2
设计介绍 本示例完成“图书-英雄”信息的维护,需要存储两种数据:图书、英雄 图书表结构设计: 表名:BookInfo 图书名称:btitle 图书发布时间:bpub_date 英雄表结构设计: 表名:HeroInfo 英雄姓名:hname 英雄性别:hgender 英雄简介:hcontent 所属图书:hbook 图书-英雄的关系为一对多 数据库配置 在settings.py文件中,通过DATABASES项进行数据库设置 django支持的数据库包括:sqlite、mysql等主流数据库 Django默认使用SQLite数据库 创建应用 在一个项目中可以创建一到多个应用,每个应用进行一种业务处理 创建应用的命令: python manage.py startapp booktest 应用的目录结构如下图 应用默认目录结构 定义模型类 有一个数据表,就有一个模型类与之对应 打开models.py文件,定义模型类 引入包from django.db import models 模型类继承自models.Model类 说明:不需要定义主键列,在生成时会自动添加,并且值为自动增长 当输出对象时,会调用对象的str方法 from django.db import models class BookInfo(models.Model): btitle = models.CharField(max_length=20) bpub_date = models.DateTimeField() def _ _str_ _(self): return "%d" % self.pk class HeroInfo(models.Model): hname = models.CharField(max_length=20) hgender = models.BooleanField() hcontent = models.CharField(max_length=100) hBook = models.ForeignKey(‘BookInfo‘) def _ _str_ _(self): return "%d" % self.pk 生成数据表 激活模型:编辑settings.py文件,将booktest应用加入到installed_apps中 应用列表 生成迁移文件:根据模型类生成sql语句 python manage.py makemigrations 迁移文件被生成到应用的migrations目录 迁移文件 执行迁移:执行sql语句生成数据表 python manage.py migrate 测试数据操作 进入python shell,进行简单的模型API练习 python manage.py shell 进入shell后提示如下: python shell 引入需要的包: from booktest.models import BookInfo,HeroInfo from django.utils import timezone from datetime import * 查询所有图书信息: BookInfo.objects.all() 新建图书信息: b = BookInfo() b.btitle="射雕英雄传" b.bpub_date=datetime(year=1990,month=1,day=10) b.save() 查找图书信息: b=BookInfo.objects.get(pk=1) 输出图书信息: b b.id b.btitle 修改图书信息: b.btitle=u"天龙八部" b.save() 删除图书信息: b.delete() 关联对象的操作 对于HeroInfo可以按照上面的操作方式进行 添加,注意添加关联对象 h=HeroInfo() h.htitle=u‘郭靖‘ h.hgender=True h.hcontent=u‘降龙十八掌‘ h.hBook=b h.save() 获得关联集合:返回当前book对象的所有hero b.heroinfo_set.all() 有一个HeroInfo存在,必须要有一个BookInfo对象,提供了创建关联的数据: h=b.heroinfo_set.create(htitle=u‘黄蓉‘,hgender=False,hcontent=u‘打狗棍法‘) h
1.3
服务器 运行如下命令可以开启服务器 python manage.py runserver ip:port 可以不写ip,默认端口为8000 这是一个纯python编写的轻量级web服务器,仅在开发阶段使用 服务器成功启动后,提示如下信息 服务器 默认端口是8000,可以修改端口 python manage.py runserver 8080 打开浏览器,输入网址“127.0.0.1:8000”可以打开默认页面 如果修改文件不需要重启服务器,如果增删文件需要重启服务器 通过ctrl+c停止服务器 管理操作 站点分为“内容发布”和“公共访问”两部分 “内容发布”的部分负责添加、修改、删除内容,开发这些重复的功能是一件单调乏味、缺乏创造力的工作。为此,Django会根据定义的模型类完全自动地生成管理模块 使用django的管理 创建一个管理员用户 python manage.py createsuperuser,按提示输入用户名、邮箱、密码 启动服务器,通过“127.0.0.1:8000/admin”访问,输入上面创建的用户名、密码完成登录 进入管理站点,默认可以对groups、users进行管理 管理界面本地化 编辑settings.py文件,设置编码、时区 LANGUAGE_CODE = ‘zh-Hans‘ TIME_ZONE = ‘Asia/Shanghai‘ 向admin注册booktest的模型 打开booktest/admin.py文件,注册模型 from django.contrib import admin from models import BookInfo admin.site.register(BookInfo) 刷新管理页面,可以对BookInfo的数据进行增删改查操作 问题:如果在str方法中返回中文,在修改和添加时会报ascii的错误 解决:在str()方法中,将字符串末尾添加“.encode(‘utf-8‘)” 自定义管理页面 Django提供了admin.ModelAdmin类 通过定义ModelAdmin的子类,来定义模型在Admin界面的显示方式 class QuestionAdmin(admin.ModelAdmin): ... admin.site.register(Question, QuestionAdmin) 列表页属性 list_display:显示字段,可以点击列头进行排序 list_display = [‘pk‘, ‘btitle‘, ‘bpub_date‘] list_filter:过滤字段,过滤框会出现在右侧 list_filter = [‘btitle‘] search_fields:搜索字段,搜索框会出现在上侧 search_fields = [‘btitle‘] list_per_page:分页,分页框会出现在下侧 list_per_page = 10 添加、修改页属性 fields:属性的先后顺序 fields = [‘bpub_date‘, ‘btitle‘] fieldsets:属性分组 fieldsets = [ (‘basic‘,{‘fields‘: [‘btitle‘]}), (‘more‘, {‘fields‘: [‘bpub_date‘]}), ] 关联对象 对于HeroInfo模型类,有两种注册方式 方式一:与BookInfo模型类相同 方式二:关联注册 按照BookInfor的注册方式完成HeroInfo的注册 接下来实现关联注册 from django.contrib import admin from models import BookInfo,HeroInfo class HeroInfoInline(admin.StackedInline): model = HeroInfo extra = 2 class BookInfoAdmin(admin.ModelAdmin): inlines = [HeroInfoInline] admin.site.register(BookInfo, BookInfoAdmin) 可以将内嵌的方式改为表格 class HeroInfoInline(admin.TabularInline) 布尔值的显示 发布性别的显示不是一个直观的结果,可以使用方法进行封装 def gender(self): if self.hgender: return ‘男‘ else: return ‘女‘ gender.short_description = ‘性别‘ 在admin注册中使用gender代替hgender class HeroInfoAdmin(admin.ModelAdmin): list_display = [‘id‘, ‘hname‘, ‘gender‘, ‘hcontent‘]
1.4
视图 在django中,视图对WEB请求进行回应 视图接收reqeust对象作为第一个参数,包含了请求的信息 视图就是一个Python函数,被定义在views.py中 #coding:utf-8 from django.http import HttpResponse def index(request): return HttpResponse("index") def detail(request,id): return HttpResponse("detail %s" % id) 定义完成视图后,需要配置urlconf,否则无法处理请求 URLconf 在Django中,定义URLconf包括正则表达式、视图两部分 Django使用正则表达式匹配请求的URL,一旦匹配成功,则调用应用的视图 注意:只匹配路径部分,即除去域名、参数后的字符串 在test1/urls.py插入booktest,使主urlconf连接到booktest.urls模块 url(r‘^‘, include(‘booktest.urls‘)), 在booktest中的urls.py中添加urlconf from django.conf.urls import url from . import views urlpatterns = [ url(r‘^$‘, views.index), url(r‘^([0-9]+)/$‘, views.detail), ]
1.5
模板 模板是html页面,可以根据视图中传递的数据填充值 创建模板的目录如下图: 模板目录 修改settings.py文件,设置TEMPLATES的DIRS值 ‘DIRS‘: [os.path.join(BASE_DIR, ‘templates‘)], 在模板中访问视图传递的数据 {{输出值,可以是变量,也可以是对象.属性}} {%执行代码段%} 定义index.html模板 <!DOCTYPE html> <html> <head> <title>首页</title> </head> <body> <h1>图书列表</h1> <ul> {%for book in booklist%} <li> <a href="{{book.id}}"> {{book.btitle}} </a> </li> {%endfor%} </ul> </body> </html> 定义detail.html模板 在模板中访问对象成员时,都以属性的方式访问,即方法也不能加括号 <!DOCTYPE html> <html> <head> <title>详细页</title> </head> <body> <h1>{{book.btitle}}</h1> <ul> {%for hero in book.heroinfo_set.all%} <li>{{hero.hname}}---{{hero.hcontent}}</li> {%endfor%} </ul> </body> </html> 使用模板 编辑views.py文件,在方法中调用模板 from django.http import HttpResponse from django.template import RequestContext, loader from models import BookInfo def index(request): booklist = BookInfo.objects.all() template = loader.get_template(‘booktest/index.html‘) context = RequestContext(request, {‘booklist‘: booklist}) return HttpResponse(template.render(context)) def detail(reqeust, id): book = BookInfo.objects.get(pk=id) template = loader.get_template(‘booktest/detail.html‘) context = RequestContext(reqeust, {‘book‘: book}) return HttpResponse(template.render(context)) 去除模板的硬编码 在index.html模板中,超链接是硬编码的,此时的请求地址为“127.0.0.1/1/” <a href="{{book.id}}"> 看如下情况:将urlconf中详细页改为如下,链接就找不到了 url(r‘^book/([0-9]+)/$‘, views.detail), 此时的请求地址应该为“127.0.0.1/book/1/” 问题总结:如果在模板中地址硬编码,将来urlconf修改后,地址将失效 解决:使用命名的url设置超链接 修改test1/urls.py文件,在include中设置namespace url(r‘^admin/‘, include(admin.site.urls, namespace=‘booktest‘)), 修改booktest/urls.py文件,设置name url(r‘^book/([0-9]+)/$‘, views.detail, name="detail"), 修改index.html模板中的链接 <a href="{%url ‘booktest:detail‘ book.id%}"> Render简写 Django提供了函数Render()简化视图调用模板、构造上下文 from django.shortcuts import render from models import BookInfo def index(reqeust): booklist = BookInfo.objects.all() return render(reqeust, ‘booktest/index.html‘, {‘booklist‘: booklist}) def detail(reqeust, id): book = BookInfo.objects.get(pk=id) return render(reqeust, ‘booktest/detail.html‘, {‘book‘: book})
总结:
总结
安装配置django运行的环境
编写模型,使用简单API与数据库交互
使用django的后台管理中维护数据
通过视图接收请求,通过模型获取数据,展示出来
调用模板完成展示
作业
设计一对多关系的两个模型类
使用django后台管理
通过视图、urlconf、模板完成数据的展示
控制在2个小时之内完成
--------------------------------------------------------------
2.1
定义模型 在模型中定义属性,会生成表中的字段 django根据属性的类型确定以下信息: 当前选择的数据库支持字段的类型 渲染管理表单时使用的默认html控件 在管理站点最低限度的验证 django会为表增加自动增长的主键列,每个模型只能有一个主键列,如果使用选项设置某属性为主键列后,则django不会再生成默认的主键列 属性命名限制 不能是python的保留关键字 由于django的查询方式,不允许使用连续的下划线 定义属性 定义属性时,需要字段类型 字段类型被定义在django.db.models.fields目录下,为了方便使用,被导入到django.db.models中 使用方式 导入from django.db import models 通过models.Field创建字段类型的对象,赋值给属性 对于重要数据都做逻辑删除,不做物理删除,实现方法是定义isDelete属性,类型为BooleanField,默认值为False 字段类型 AutoField:一个根据实际ID自动增长的IntegerField,通常不指定 如果不指定,一个主键字段将自动添加到模型中 BooleanField:true/false 字段,此字段的默认表单控制是CheckboxInput NullBooleanField:支持null、true、false三种值 CharField(max_length=字符长度):字符串,默认的表单样式是 TextInput TextField:大文本字段,一般超过4000使用,默认的表单控件是Textarea IntegerField:整数 DecimalField(max_digits=None, decimal_places=None):使用python的Decimal实例表示的十进制浮点数 DecimalField.max_digits:位数总数 DecimalField.decimal_places:小数点后的数字位数 FloatField:用Python的float实例来表示的浮点数 DateField[auto_now=False, auto_now_add=False]):使用Python的datetime.date实例表示的日期 参数DateField.auto_now:每次保存对象时,自动设置该字段为当前时间,用于"最后一次修改"的时间戳,它总是使用当前日期,默认为false 参数DateField.auto_now_add:当对象第一次被创建时自动设置当前时间,用于创建的时间戳,它总是使用当前日期,默认为false 该字段默认对应的表单控件是一个TextInput. 在管理员站点添加了一个JavaScript写的日历控件,和一个“Today"的快捷按钮,包含了一个额外的invalid_date错误消息键 auto_now_add, auto_now, and default 这些设置是相互排斥的,他们之间的任何组合将会发生错误的结果 TimeField:使用Python的datetime.time实例表示的时间,参数同DateField DateTimeField:使用Python的datetime.datetime实例表示的日期和时间,参数同DateField FileField:一个上传文件的字段 ImageField:继承了FileField的所有属性和方法,但对上传的对象进行校验,确保它是个有效的image 字段选项 通过字段选项,可以实现对字段的约束 在字段对象时通过关键字参数指定 null:如果为True,Django 将空值以NULL 存储到数据库中,默认值是 False blank:如果为True,则该字段允许为空白,默认值是 False 对比:null是数据库范畴的概念,blank是表单验证证范畴的 db_column:字段的名称,如果未指定,则使用属性的名称 db_index:若值为 True, 则在表中会为此字段创建索引 default:默认值 primary_key:若为 True, 则该字段会成为模型的主键字段 unique:如果为 True, 这个字段在表中必须有唯一值 关系 关系的类型包括 ForeignKey:一对多,将字段定义在多的端中 ManyToManyField:多对多,将字段定义在两端中 OneToOneField:一对一,将字段定义在任意一端中 可以维护递归的关联关系,使用‘self‘指定,详见“自关联” 用一访问多:对象.模型类小写_set bookinfo.heroinfo_set 用一访问一:对象.模型类小写 heroinfo.bookinfo 访问id:对象.属性_id heroinfo.book_id 元选项 在模型类中定义类Meta,用于设置元信息 元信息db_table:定义数据表名称,推荐使用小写字母,数据表的默认名称 <app_name>_<model_name> ordering:对象的默认排序字段,获取对象的列表时使用,接收属性构成的列表 class BookInfo(models.Model): ... class Meta(): ordering = [‘id‘] 字符串前加-表示倒序,不加-表示正序 class BookInfo(models.Model): ... class Meta(): ordering = [‘-id‘] 排序会增加数据库的开销 示例演示 创建test2项目,并创建booktest应用,使用mysql数据库 定义图书模型 class BookInfo(models.Model): btitle = models.CharField(max_length=20) bpub_date = models.DateTimeField() bread = models.IntegerField(default=0) bcommet = models.IntegerField(default=0) isDelete = models.BooleanField(default=False) 英雄模型 class HeroInfo(models.Model): hname = models.CharField(max_length=20) hgender = models.BooleanField(default=True) isDelete = models.BooleanField(default=False) hcontent = models.CharField(max_length=100) hbook = models.ForeignKey(‘BookInfo‘) 定义index、detail视图 index.html、detail.html模板 配置url,能够完成图书及英雄的展示 测试数据 模型BookInfo的测试数据 insert into booktest_bookinfo(btitle,bpub_date,bread,bcommet,isDelete) values (‘射雕英雄传‘,‘1980-5-1‘,12,34,0), (‘天龙八部‘,‘1986-7-24‘,36,40,0), (‘笑傲江湖‘,‘1995-12-24‘,20,80,0), (‘雪山飞狐‘,‘1987-11-11‘,58,24,0) 模型HeroInfo的测试数据 insert into booktest_heroinfo(hname,hgender,hbook_id,hcontent,isDelete) values (‘郭靖‘,1,1,‘降龙十八掌‘,0), (‘黄蓉‘,0,1,‘打狗棍法‘,0), (‘黄药师‘,1,1,‘弹指神通‘,0), (‘欧阳锋‘,1,1,‘蛤蟆功‘,0), (‘梅超风‘,0,1,‘九阴白骨爪‘,0), (‘乔峰‘,1,2,‘降龙十八掌‘,0), (‘段誉‘,1,2,‘六脉神剑‘,0), (‘虚竹‘,1,2,‘天山六阳掌‘,0), (‘王语嫣‘,0,2,‘神仙姐姐‘,0), (‘令狐冲‘,1,3,‘独孤九剑‘,0), (‘任盈盈‘,0,3,‘弹琴‘,0), (‘岳不群‘,1,3,‘华山剑法‘,0), (‘东方不败‘,0,3,‘葵花宝典‘,0), (‘胡斐‘,1,4,‘胡家刀法‘,0), (‘苗若兰‘,0,4,‘黄衣‘,0), (‘程灵素‘,0,4,‘医术‘,0), (‘袁紫衣‘,0,4,‘六合拳‘,0)
2.2
类的属性 objects:是Manager类型的对象,用于与数据库进行交互 当定义模型类时没有指定管理器,则Django会为模型类提供一个名为objects的管理器 支持明确指定模型类的管理器 class BookInfo(models.Model): ... books = models.Manager() 当为模型类指定管理器后,django不再为模型类生成名为objects的默认管理器 管理器Manager 管理器是Django的模型进行数据库的查询操作的接口,Django应用的每个模型都拥有至少一个管理器 自定义管理器类主要用于两种情况 情况一:向管理器类中添加额外的方法:见下面“创建对象”中的方式二 情况二:修改管理器返回的原始查询集:重写get_queryset()方法 class BookInfoManager(models.Manager): def get_queryset(self): return super(BookInfoManager, self).get_queryset().filter(isDelete=False) class BookInfo(models.Model): ... books = BookInfoManager() 创建对象 当创建对象时,django不会对数据库进行读写操作 调用save()方法才与数据库交互,将对象保存到数据库中 使用关键字参数构造模型对象很麻烦,推荐使用下面的两种之式 说明: _init _方法已经在基类models.Model中使用,在自定义模型中无法使用, 方式一:在模型类中增加一个类方法 class BookInfo(models.Model): ... @classmethod def create(cls, title, pub_date): book = cls(btitle=title, bpub_date=pub_date) book.bread=0 book.bcommet=0 book.isDelete = False return book 引入时间包:from datetime import * 调用:book=BookInfo.create("hello",datetime(1980,10,11)); 保存:book.save() 方式二:在自定义管理器中添加一个方法 在管理器的方法中,可以通过self.model来得到它所属的模型类 class BookInfoManager(models.Manager): def create_book(self, title, pub_date): book = self.model() book.btitle = title book.bpub_date = pub_date book.bread=0 book.bcommet=0 book.isDelete = False return book class BookInfo(models.Model): ... books = BookInfoManager() 调用:book=BookInfo.books.create_book("abc",datetime(1980,1,1)) 保存:book.save() 在方式二中,可以调用self.create()创建并保存对象,不需要再手动save() class BookInfoManager(models.Manager): def create_book(self, title, pub_date): book = self.create(btitle = title,bpub_date = pub_date,bread=0,bcommet=0,isDelete = False) return book class BookInfo(models.Model): ... books = BookInfoManager() 调用:book=Book.books.create_book("abc",datetime(1980,1,1)) 查看:book.pk 实例的属性 DoesNotExist:在进行单个查询时,模型的对象不存在时会引发此异常,结合try/except使用 实例的方法 str (self):重写object方法,此方法在将对象转换成字符串时会被调用 save():将模型对象保存到数据表中 delete():将模型对象从数据表中删除
2.3
简介 查询集表示从数据库中获取的对象集合 查询集可以含有零个、一个或多个过滤器 过滤器基于所给的参数限制查询的结果 从Sql的角度,查询集和select语句等价,过滤器像where和limit子句 接下来主要讨论如下知识点 查询集 字段查询:比较运算符,F对象,Q对象 查询集 在管理器上调用过滤器方法会返回查询集 查询集经过过滤器筛选后返回新的查询集,因此可以写成链式过滤 惰性执行:创建查询集不会带来任何数据库的访问,直到调用数据时,才会访问数据库 何时对查询集求值:迭代,序列化,与if合用 返回查询集的方法,称为过滤器 all() filter() exclude() order_by() values():一个对象构成一个字典,然后构成一个列表返回 写法: filter(键1=值1,键2=值2) 等价于 filter(键1=值1).filter(键2=值2) 返回单个值的方法 get():返回单个满足条件的对象 如果未找到会引发"模型类.DoesNotExist"异常 如果多条被返回,会引发"模型类.MultipleObjectsReturned"异常 count():返回当前查询的总条数 first():返回第一个对象 last():返回最后一个对象 exists():判断查询集中是否有数据,如果有则返回True 限制查询集 查询集返回列表,可以使用下标的方式进行限制,等同于sql中的limit和offset子句 注意:不支持负数索引 使用下标后返回一个新的查询集,不会立即执行查询 如果获取一个对象,直接使用[0],等同于[0:1].get(),但是如果没有数据,[0]引发IndexError异常,[0:1].get()引发DoesNotExist异常 查询集的缓存 每个查询集都包含一个缓存来最小化对数据库的访问 在新建的查询集中,缓存为空,首次对查询集求值时,会发生数据库查询,django会将查询的结果存在查询集的缓存中,并返回请求的结果,接下来对查询集求值将重用缓存的结果 情况一:这构成了两个查询集,无法重用缓存,每次查询都会与数据库进行一次交互,增加了数据库的负载 print([e.title for e in Entry.objects.all()]) print([e.title for e in Entry.objects.all()]) 情况二:两次循环使用同一个查询集,第二次使用缓存中的数据 querylist=Entry.objects.all() print([e.title for e in querylist]) print([e.title for e in querylist]) 何时查询集不会被缓存:当只对查询集的部分进行求值时会检查缓存,但是如果这部分不在缓存中,那么接下来查询返回的记录将不会被缓存,这意味着使用索引来限制查询集将不会填充缓存,如果这部分数据已经被缓存,则直接使用缓存中的数据 字段查询 实现where子名,作为方法filter()、exclude()、get()的参数 语法:属性名称__比较运算符=值 表示两个下划线,左侧是属性名称,右侧是比较类型 对于外键,使用“属性名_id”表示外键的原始值 转义:like语句中使用了%与,匹配数据中的%与,在过滤器中直接写,例如:filter(title__contains="%")=>where title like ‘%\%%‘,表示查找标题中包含%的 比较运算符 exact:表示判等,大小写敏感;如果没有写“ 比较运算符”,表示判等 filter(isDelete=False) contains:是否包含,大小写敏感 exclude(btitle__contains=‘传‘) startswith、endswith:以value开头或结尾,大小写敏感 exclude(btitle__endswith=‘传‘) isnull、isnotnull:是否为null filter(btitle__isnull=False) 在前面加个i表示不区分大小写,如iexact、icontains、istarswith、iendswith in:是否包含在范围内 filter(pk__in=[1, 2, 3, 4, 5]) gt、gte、lt、lte:大于、大于等于、小于、小于等于 filter(id__gt=3) year、month、day、week_day、hour、minute、second:对日期间类型的属性进行运算 filter(bpub_date__year=1980) filter(bpub_date__gt=date(1980, 12, 31)) 跨关联关系的查询:处理join查询 语法:模型类名 <属性名> <比较> 注:可以没有__<比较>部分,表示等于,结果同inner join 可返向使用,即在关联的两个模型中都可以使用 filter(heroinfo_ _hcontent_ _contains=‘八‘) 查询的快捷方式:pk,pk表示primary key,默认的主键是id filter(pk__lt=6) 聚合函数 使用aggregate()函数返回聚合函数的值 函数:Avg,Count,Max,Min,Sum from django.db.models import Max maxDate = list.aggregate(Max(‘bpub_date‘)) count的一般用法: count = list.count() F对象 可以使用模型的字段A与字段B进行比较,如果A写在了等号的左边,则B出现在等号的右边,需要通过F对象构造 list.filter(bread__gte=F(‘bcommet‘)) django支持对F()对象使用算数运算 list.filter(bread__gte=F(‘bcommet‘) * 2) F()对象中还可以写作“模型类__列名”进行关联查询 list.filter(isDelete=F(‘heroinfo__isDelete‘)) 对于date/time字段,可与timedelta()进行运算 list.filter(bpub_date__lt=F(‘bpub_date‘) + timedelta(days=1)) Q对象 过滤器的方法中关键字参数查询,会合并为And进行 需要进行or查询,使用Q()对象 Q对象(django.db.models.Q)用于封装一组关键字参数,这些关键字参数与“比较运算符”中的相同 from django.db.models import Q list.filter(Q(pk_ _lt=6)) Q对象可以使用&(and)、|(or)操作符组合起来 当操作符应用在两个Q对象时,会产生一个新的Q对象 list.filter(pk_ _lt=6).filter(bcommet_ _gt=10) list.filter(Q(pk_ _lt=6) | Q(bcommet_ _gt=10)) 使用~(not)操作符在Q对象前表示取反 list.filter(~Q(pk__lt=6)) 可以使用&|~结合括号进行分组,构造做生意复杂的Q对象 过滤器函数可以传递一个或多个Q对象作为位置参数,如果有多个Q对象,这些参数的逻辑为and 过滤器函数可以混合使用Q对象和关键字参数,所有参数都将and在一起,Q对象必须位于关键字参数的前面
2.4
自连接 对于地区信息,属于一对多关系,使用一张表,存储所有的信息 类似的表结构还应用于分类信息,可以实现无限级分类 新建模型AreaInfo,生成迁移 class AreaInfo(models.Model): atitle = models.CharField(max_length=20) aParent = models.ForeignKey(‘self‘, null=True, blank=True) 访问关联对象 上级对象:area.aParent 下级对象:area.areainfo_set.all() 加入测试数据(在workbench中,参见“省市区mysql.txt”) 在booktest/views.py中定义视图area from models import AreaInfo def area(request): area = AreaInfo.objects.get(pk=130100) return render(request, ‘booktest/area.html‘, {‘area‘: area}) 定义模板area.html <!DOCTYPE html> <html> <head> <title>地区</title> </head> <body> 当前地区:{{area.atitle}} <hr/> 上级地区:{{area.aParent.atitle}} <hr/> 下级地区: <ul> { %for a in area.areainfo_set.all%} <li>{{a.atitle}}</li> { %endfor%} </ul> </body> </html> 在booktest/urls.py中配置一个新的urlconf urlpatterns = [ url(r‘^area/$‘, views.area, name=‘area‘) ]
总结:
总结
使用mysql数据库
定义模型,生成迁移
定义管理器
查询
自连接
作业
熟练完成当天代码
上次作业中定义的模型,改为使用mysql数据库操作
对模型数据进行查询
------------------------------------------
3.1