Python Web(二)
infi-chu:
http://www.cnblogs.com/infi-chu/
一、django-debug-toolbar
django-debug-toolbar 是一组可配置的面板,可显示有关当前请求/响应的各种调试信息,并在单击时显示有关面板内容的更多详细信息。
github链接:
文档链接:
1.安装
pip install django-debug-toolbar
2.配置
settings.py
# 将debug-toolbar添加到app配置中
installed_apps = [
…
'debug_toolbar',
]
# 在中间件中加入debugtoolbarmiddleware
middleware = [
# ...
'debug_toolbar.middleware.debugtoolbarmiddleware',
# ...
]
# 如果是本机调试,还在将127.0.0.1加入 internal_ips
internal_ips = [‘127.0.0.1’, ]
urls.py
from django.conf import settings
from django.conf.urls import include, url
if settings.debug:
import debug_toolbar
urlpatterns = [
url(r'^__debug__/', include(debug_toolbar.urls)),
] + urlpatterns
配置jquery
debug_toolbar_config = {
"jquery_url": '//cdn.bootcss.com/jquery/2.2.4/jquery.min.js',
}
# 如果在django项目中使用了jquery的话就可以直接将这一项置为空,那么django-debug-toolbar 就会使用你项目中用到的jquery:
debug_toolbar_config = {
"jquery_url": '',
}
二、表与表之间的关系
1.一对一
userinfo 表
id | name | age |
---|---|---|
1 | 张三 | 12 |
2 | 李四 | 58 |
private 表
id | salary | sp_id |
---|---|---|
1 | 100 | 1 |
2 | 400 | 2 |
models.py
class userinfo(models.model):
name = models.charfield(max_length=32, null=true)
age = models.integerfield(null=true)
class private(models.model):
salary = models.charfield(max_length=32, null=true)
sp = models.onetoonefield("userinfo", null=true) #onetoonefield: 一对一, 默认要求该字段必须是唯一的 unique 外键关系
插入信息
models.userinfo.objects.create(name='张三',age=12)
models.private.objects.create(salary=100,sp_id=1)
查询
#从母表查询子表中的数据
#方法1:res = models.userinfo.objects.filter(name='张三').first().private.salary #子表表名小写.子表字段名
#方法2:res = models.userinfo.objects.filter(name='张三').values('private__salary')
#从子表查询母表信息
#方法1:res = models.private.objects.filter(salary='100').first().sp.name
#方法2:res = models.private.objects.values('sp__name'):
2.一对多
3.多对多(通过关系表)
models.py
class boy(models.model):
bname = models.charfield(max_length=30,null=true)
class girl(models.model):
gname = models.charfield(max_length=30,null=true)
class boy2girl(models.model):
b = models.foreignkey('boy',null=true)
g = models.foreignkey('girl',null=true)
#联合唯一属性
class meta:
unique_together=[
('b','g')
]
插入信息
import random
boys =[
models.boy(bname='男1'),
models.boy(bname='男2'),
models.boy(bname='男3'),
models.boy(bname='男4'),
models.boy(bname='男5'),
models.boy(bname='男6')
]
res = models.boy.objects.bulk_create(boys)
girls =[
models.girl(gname='女1'),
models.girl(gname='女2'),
models.girl(gname='女3'),
models.girl(gname='女4'),
models.girl(gname='女5'),
models.girl(gname='女6'),
models.girl(gname='女7'),
models.girl(gname='女8'),
]
models.girl.objects.bulk_create(girls)
a = [
models.boy2girl(b_id=random.randint(1,6),g_id=1),
models.boy2girl(b_id=random.randint(1,6),g_id=2),
models.boy2girl(b_id=random.randint(1,6),g_id=3),
models.boy2girl(b_id=random.randint(1,6),g_id=4),
models.boy2girl(b_id=random.randint(1,6),g_id=5),
models.boy2girl(b_id=random.randint(1,6),g_id=6),
models.boy2girl(b_id=random.randint(1,6),g_id=7),
models.boy2girl(b_id=random.randint(1,6),g_id=8),
]
models.boy2girl.objects.bulk_create(a)
查询
#通过关系表查询,查boy位男1对于的女的信息
#方法1:res = models.boy2girl.objects.filter(b__bname='男1').values('g__gname')
#方法2:
res = models.boy2girl.objects.filter(b__bname='男1').all()
for a in res:
print(res.g.gname)
#通过boy表查女的信息
#方法1: res = models.boy.objects.filter(bname='男1').values('boy2girl__g__gname')
#方法2:
res = models.boy.objects.filter(bname='男1').all()
for a in res:
for b in a.boy2girl_set.all():
print(b.g.gname)
4.多对多(不通过关系表)
models.py
class boy1(models.model):
bname = models.charfield(max_length=32, null=true)
g = models.manytomanyfield('girl', null=true)
#他会生成一个boy1_g的表
class girl1(models.model):
gname = models.charfield(max_length=32, null=true)
插入信息
boys =[
models.boy(bname='男1'),
models.boy(bname='男2'),
models.boy(bname='男3'),
models.boy(bname='男4'),
models.boy(bname='男5'),
models.boy(bname='男6')
]
res = models.boy1.objects.bulk_create(boys)
#
girls =[
models.girl(gname='女1'),
models.girl(gname='女2'),
models.girl(gname='女3'),
models.girl(gname='女4'),
models.girl(gname='女5'),
models.girl(gname='女6'),
models.girl(gname='女7'),
models.girl(gname='女8'),
]
models.girl1.objects.bulk_create(girls)
建立两者关系
- 取出boy的对象
- 在选择其中的g对象,进行add 添加/删除/查询 girl的id
添加(add)
models.boy1.objects.filter(bname='男1').first().g.add(1,2,3,4,5,2) #会自动去重保持唯一性也不会因为相同而报错
删除(remove)
models.boy1.objects.filter(bname='男1').first().g.remove(1)
查询(all)
models.boy1.objects.filter(bname='男1').first().g.all()
清除(clear)
models.boy1.objects.filter(bname='男1').first().g.clear() #清除所有
【注】
add进行添加时候如果有会自动去重,他自带联合唯一的效果
三、mysql与django-orm数据类型对应关系
数据类型 | mysql | djamgo-orm |
---|---|---|
数字 | tinyint | 不存在 |
- | smallint | smallintegerfield(有符号) positivesmallintegerfield(没符号) |
- | mediumint | 不存在 |
- | int (unsigned) | integerfield(有符号)positiveintegerfield(没符号) |
- | bigint | bigintegerfield(有符号) positivebigintegerfield(没符号) |
- | decimal | decimalfield |
- | float | floatfield |
- | double | 不存在 |
字符串 | char | 不存在 |
- | varchar | charfield |
- | text | textfield |
时间日期 | date | datefield |
- | datetime | datetimefield |
- | timestamp | 不存在 |
四、mysql与django-orm数据类型对应属性
null 数据库中字段是否可以为空
db_column 数据库中字段的列名
default 数据库中字段的默认值
primary_key 数据库中字段是否为主键
db_index 数据库中字段是否可以建立索引
unique 数据库中字段是否可以建立唯一索引
class meta:
### 联合唯一索引
unique_together=[
('b', 'g')
]
#### 联合索引
index_together = [
('b', 'g')
]
五、django只在admin中生效的数据类型
- emailfield(charfield):
字符串类型
对应信息是不是邮箱格式进行验证 - 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:允许文件夹
- 参数:
- imagefield(filefield):
字符串类型
路径保存在数据库,文件上传到指定目录- 参数:
- upload_to = "" : 上传文件的保存路径
- storage = none:存储组件,默认django.core.files.storage.filesystemstorage
- imagefield(filefield):上传图片的高度保存的数据库字段名(字符串)
- height_field=none:上传图片的宽度保存的数据库字段名(字符串)
- 参数:
六、django只在admin中生效的属性
-
verbose_name:admin中显示的字段名称
-
blank:admin中是否允许用户输入为空
-
editable:admin中是否可以编辑
-
help_text:admin中该字段的提示信息
-
choices:admin中显示选择框的内容,用不变动的数据放在内存中从而避免跨表操作
- 如:gf = models.integerfield(choices=[(0, '何穗'),(1, '大表姐'),],default=1)
-
error_messages: 自定义错误信息(字典类型),从而定制想要显示的错误信息;
- 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'), ]
)
- from django.core.validators import regexvalidator
七、django自带分页
1.导入模块
from django.core.paginator import paginator
2.读取信息
userlist = models.userinfo.objects.all()
3.生成painantor对象
生成painantor对象
paginator = paginator(userlist, 10) #对象,每页多少条数据
painantor的属性与方法
- 属性
- object_list:返回所有页对象的的列表
- per_page: 每页显示条目数量
- count:数据总个数
- num_pages:总页数
- page_range:总页数的索引范围,如: (1,10),(1,200)
- 方法
- page(第几页):page对象
4.生成page对象
生成page对象
page_1 = paginator.page(1) #第一页的信息
page的属性和方法
- 属性
- object_list:返回当前页对象的的列表
- number:返回当前页是第几页,从1开始
- paginator:当前页对应的paginator对象
- 方法
- has_next(): 是否有下一页,有就返回ture
- next_page_numbe()r:返回值下一页页码
- has_previous():是否有上一页,有就返回ture
- previous_page_number():返回值上一页页码
【注】
用orm获得表里面信息的时候,它是个列表,可以利用列表的切片技术来进行内容选取而达到分页的效果
下一篇: 微服务与K8S容器云平台架构