昨日内容回顾:
day67
内容回顾:
1. 视图
1. CBV 和 FBV
from django.views import View
class AddPublisher(View):
def dispatch(self, request, *args, **kwargs):
ret = super().dispatch(request, *args, **kwargs)
return ret
def get(self,request):
pass
def post(self,request):
pass
使用:
url(r'^add_publisher/', views.AddPublisher.as_view()),
2. CBV的简单的流程
1. AddPublisher.as_view()得到一个view函数
url(r'^add_publisher/', view),
2. 请求到来的时候 执行view:
1. 实例化AddPublisher的类,赋值给self
2. 执行dispatch方法
3. 通过反射获取到get或者post的方法
4. 执行get或者post方法,返回HttpResponse对象
3. 装饰器的使用
1. FBV 正常使用
@装饰器
2. CBV
from django.utils.decorators import method_decorator
1. 给get或者post方法加
2. 给dispatch方法加
3. 给类加(写name='get')
4. request
request.method 请求方法 GET POST
request.GET URL传参 {}
request.POST form表单传的参数
request.body 请求体
request.FILES 上传的文件
request.path_info URL路径 不包含域名和URL参数
request.get_full_path() URL路径包含URL参数
request.get_host() 获取IP和端口
5. response
1. HttpResponse('字符串') —》 页面看到的就是字符串 content—type: text/html;charset=utf8
2. render(request,'HTML文件名',{参数}) ——》返回一个页面
3. redirect('/index/') 跳转 重定向 返回一个响应头 Location:'/index/'
4. JsonResponse(字典) content—type: application/json
返回列表时 safe=False
JsonResponse(data,safe=False)
2. 路由
1.
from django.conf.urls import url
urlpatterns =[
url(正则表达式,视图,参数,name)
url(正则表达式,视图,参数,name)
url(正则表达式,视图,参数,name)
]
2. 正则表达式
加$
[0-9] /d
+ 一个或多个
?0个或1个
* 0个或多个
. 除了换行符的所有
3. 分组和命名分组
url(r'book/[0-9]{4}/[0-9]{2}/',views.book)
无名分组:
url(r'book/([0-9]{4})/([0-9]{2})/',views.book)
按照位置传参的方式传给视图
命名分组
url(r'book/(?P
按照关键字传参的方式给视图
捕获到的参数都是字符串
4. 命名url和url的反向解析
url(r'home',view,home,name='home')
url(r'book/([0-9]{4})/([0-9]{2})/',views.book,name='book')
url(r'book/(?P
视图中反向解析URL:
from django.shortcuts import reverse
reverse('home') ——》 /home/
reverse('book',args=('1999','08')) ——》/book/1999/08/
reverse('book2',kwargs={'year':'1998','month':'08'}) ——》 /book/1998/08/
模板中反向解析URL:
{% url 'home' %} ——》 /home/
无名分组:
{% url 'book' '1999' '08' %} ——》/book/1999/08/
有名分组:
{% url 'book' '1999' '08' %} ——》/book/1999/08/
{% url 'book' year='1999' month='08' %} ——》/book/1999/08/
{% url 'book' month='08' year='1999' %} ——》/book/1999/08/
5. include
from app01 import urls as app01_urls
from app02 import urls as app02_urls
url('app01/', include(app01_urls)),
url('app02/', include(app02_urls))
url('app01/', include('app01.urls')),
url('app02/', include('app02.urls'))
5. namespace
3. ORM
1. mysql的配置
1. 创建mysql数据库
2. settings配置
ENGINE: 'mysql'
NAME: '数据库名称'
HOST:IP
PORT: 3306
USER: 'root'
PASSWORD: ''
3. 告诉django使用pymysql来连接mysql数据库
在项目同名的文件夹下的__init__.py中写:
import pymysql
pymysql.install_as_MySQLdb()
4. 创建model
class Person(models.Model)
name = models.CharField(max_length=32)
5. 执行两条数据库命令
python manage.py makemigrations # 记录models的变更记录
python manage.py migrate # 把变革记录更新到数据库中
2. ORM操作
1. 查
models.Person.objects.all() # 查所有
models.Person.objects.get(id=1,name='xxx') # 查一个对象 满足条件的
models.Person.objects.filter(id=1,name='xxx') # 查询满足条件的所有对象 列表
models.Person.objects.filter(id=1,name='xxx').order_by('id')
属性:
pub_obj.name
外键的 book
book_obj.name
book_obj.publisher ——》 这是书籍关联的出版社对象
book_obj.publisher_id ——》 这是数据库存的数据
book_obj.publisher.id
book_obj.publisher.name
多对多 author
author.name
author.books ——》 多对多的管理对象
author.books.all() 所有作者关联的书籍对象列表
2. 增加:
models.Publisher.objects.creatte(name='xxxx')
外键
models.Book.objects.creatte(name='xxxx',publisher=pub_obj)
models.Book.objects.creatte(name='xxxx',publisher_id=pub_obj.id)
多对多
author_obj = models.Author.objects.creatte(name='xxx')
author_obj.books.set([1,2,3])
3. 删除
models.Publisher.objects.get(id=1).delete()
models.Publisher.objects.filter(id=1).delete
4. 修改
pub_obj.name = new_name
pub_obj.save()
book_obj.name= new_name
book_obj.publisher = new_pub_obj
book_obj.publisher_id = 2
book_obj.save()
author_obj.name=new_name
author_obj.save()
author_obj.books.set([1,2])
在我们图书管理系统中,删除有三个url,现在有一个需求把三个url写成一个实现同样的功能。
urls中这样写:
url(r'del_(publisher|book|author)/(\d+)',views.delete_all)
views中的代码:
def delete_all(request,table,del_id): print(table) table_obj = getattr(models,table.capitalize()) table_obj.objects.get(id = del_id).delete() return redirect(reverse(table))
url通过正则匹配分组,将publisher,book,author,当作参数传给delete_all,然后table接受参数后,通过反射getattr取到类然后进行ORM操作。最后通过反向解析reverse返回。
ORM介绍:
对象关系映射(Object Relational Mapping,简称ORM)模式是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术。
Django中的ORM:
Django项目使用MySQL数据库:
1. 在Django项目的settings.py文件中,配置数据库连接信息:
1
2
3
4
5
6
7
8
9
10
|
DATABASES
=
{
"default"
: {
"ENGINE"
:
"django.db.backends.mysql"
,
"NAME"
:
"你的数据库名称"
,
# 需要自己手动创建数据库
"USER"
:
"数据库用户名"
,
"PASSWORD"
:
"数据库密码"
,
"HOST"
:
"数据库IP"
,
"POST"
:
3306
}
}
|
2. 在与Django项目同名的目录下的__init__.py文件中写如下代码,告诉Django使用pymysql模块连接MySQL数据库:
1
2
3
|
import
pymysql
pymysql.install_as_MySQLdb()
|
字段:
常用字段
AutoField
自增的整形字段,必填参数primary_key=True,则成为数据库的主键。无该字段时,django自动创建。
一个model不能有两个AutoField字段。
IntegerField
一个整数类型。数值的范围是 -2147483648 ~ 2147483647。
CharField
字符类型,必须提供max_length参数。max_length表示字符的长度。
DateField
日期类型,日期格式为YYYY-MM-DD,相当于Python中的datetime.date的实例。
参数:
- auto_now:每次修改时修改为当前日期时间。
- auto_now_add:新创建对象时自动添加当前日期时间。
auto_now和auto_now_add和default参数是互斥的,不能同时设置。
DatetimeField
日期时间字段,格式为YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ],相当于Python中的datetime.datetime的实例。
字段类型:
AutoField(Field)
- int自增列,必须填入参数 primary_key=True
BigAutoField(AutoField)
- bigint自增列,必须填入参数 primary_key=True
注:当model中如果没有自增列,则自动会创建一个列名为id的列
from django.db import models class UserInfo(models.Model): # 自动创建一个列名为id的且为自增的整数列 username = models.CharField(max_length=32) class Group(models.Model): # 自定义自增列 nid = models.AutoField(primary_key=True) name = models.CharField(max_length=32) SmallIntegerField(IntegerField): - 小整数 -32768 ~ 32767 PositiveSmallIntegerField(PositiveIntegerRelDbTypeMixin, IntegerField) - 正小整数 0 ~ 32767 IntegerField(Field) - 整数列(有符号的) -2147483648 ~ 2147483647 PositiveIntegerField(PositiveIntegerRelDbTypeMixin, IntegerField) - 正整数 0 ~ 2147483647 BigIntegerField(IntegerField): - 长整型(有符号的) -9223372036854775808 ~ 9223372036854775807 BooleanField(Field) - 布尔值类型 NullBooleanField(Field): - 可以为空的布尔值 CharField(Field) - 字符类型 - 必须提供max_length参数, max_length表示字符长度 TextField(Field) - 文本类型 EmailField(CharField): - 字符串类型,Django Admin以及ModelForm中提供验证机制 IPAddressField(Field) - 字符串类型,Django Admin以及ModelForm中提供验证 IPV4 机制 GenericIPAddressField(Field) - 字符串类型,Django Admin以及ModelForm中提供验证 Ipv4和Ipv6 - 参数: protocol,用于指定Ipv4或Ipv6, 'both',"ipv4","ipv6" unpack_ipv4, 如果指定为True,则输入::ffff:192.0.2.1时候,可解析为192.0.2.1,开启此功能,需要protocol="both" URLField(CharField) - 字符串类型,Django Admin以及ModelForm中提供验证 URL SlugField(CharField) - 字符串类型,Django Admin以及ModelForm中提供验证支持 字母、数字、下划线、连接符(减号) CommaSeparatedIntegerField(CharField) - 字符串类型,格式必须为逗号分割的数字 UUIDField(Field) - 字符串类型,Django Admin以及ModelForm中提供对UUID格式的验证 FilePathField(Field) - 字符串,Django Admin以及ModelForm中提供读取文件夹下文件的功能 - 参数: path, 文件夹路径 match=None, 正则匹配 recursive=False, 递归下面的文件夹 allow_files=True, 允许文件 allow_folders=False, 允许文件夹 FileField(Field) - 字符串,路径保存在数据库,文件上传到指定目录 - 参数: upload_to = "" 上传文件的保存路径 storage = None 存储组件,默认django.core.files.storage.FileSystemStorage ImageField(FileField) - 字符串,路径保存在数据库,文件上传到指定目录 - 参数: upload_to = "" 上传文件的保存路径 storage = None 存储组件,默认django.core.files.storage.FileSystemStorage width_field=None, 上传图片的高度保存的数据库字段名(字符串) height_field=None 上传图片的宽度保存的数据库字段名(字符串) DateTimeField(DateField) - 日期+时间格式 YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ] DateField(DateTimeCheckMixin, Field) - 日期格式 YYYY-MM-DD TimeField(DateTimeCheckMixin, Field) - 时间格式 HH:MM[:ss[.uuuuuu]] DurationField(Field) - 长整数,时间间隔,数据库中按照bigint存储,ORM中获取的值为datetime.timedelta类型 FloatField(Field) - 浮点型 DecimalField(Field) - 10进制小数 - 参数: max_digits,小数总长度 decimal_places,小数位长度 BinaryField(Field) - 二进制类型
自定义字段:
自定义一个char类型字段:
class MyCharField(models.Field): """ 自定义的char类型的字段类 """ def __init__(self, max_length, *args, **kwargs): self.max_length = max_length super(MyCharField, self).__init__(max_length=max_length, *args, **kwargs) def db_type(self, connection): """ 限定生成数据库表的字段类型为char,长度为max_length指定的值 """ return 'char(%s)' % self.max_length
使用自定义char类型字段:
class Class(models.Model): id = models.AutoField(primary_key=True) title = models.CharField(max_length=25) # 使用自定义的char类型的字段 cname = MyCharField(max_length=25)
字段参数:
null 数据库中字段是否可以为空
db_column 数据库中字段的列名
default 数据库中字段的默认值
primary_key 数据库中字段是否为主键
db_index 数据库中字段是否可以建立索引
unique 数据库中字段是否可以建立唯一索引
unique_for_date 数据库中字段【日期】部分是否可以建立唯一索引
unique_for_month 数据库中字段【月】部分是否可以建立唯一索引
unique_for_year 数据库中字段【年】部分是否可以建立唯一索引
verbose_name Admin中显示的字段名称
blank Admin中是否允许用户输入为空
editable Admin中是否可以编辑
help_text Admin中该字段的提示信息
choices Admin中显示选择框的内容,用不变动的数据放在内存中从而避免跨表操作
如:gf
=
models.IntegerField(choices
=
[(
0
,
'何穗'
),(
1
,
'大表姐'
),],default
=
1
)
error_messages 自定义错误信息(字典类型),从而定制想要显示的错误信息;
字典健:null, blank, invalid, invalid_choice, unique,
and
unique_for_date
如:{
'null'
:
"不能为空."
,
'invalid'
:
'格式错误'
}
validators 自定义错误验证(列表类型),从而定制想要的验证规则
from
django.core.validators
import
RegexValidator
from
django.core.validators
import
EmailValidator,URLValidator,DecimalValidator,\
MaxLengthValidator,MinLengthValidator,MaxValueValidator,MinValueValidator
如:
test
=
models.CharField(
max_length
=
32
,
error_messages
=
{
'c1'
:
'优先错信息1'
,
'c2'
:
'优先错信息2'
,
'c3'
:
'优先错信息3'
,
},
validators
=
[
RegexValidator(regex
=
'root_\d+'
, message
=
'错误了'
, code
=
'c1'
),
RegexValidator(regex
=
'root_112233\d+'
, message
=
'又错误了'
, code
=
'c2'
),
EmailValidator(message
=
'又错误了'
, code
=
'c3'
), ]
)