Infi-chu:

http://www.cnblogs.com/Infi-chu/

一、Django-debug-toolbar

django-debug-toolbar 是一组可配置的面板,可显示有关当前请求/响应的各种调试信息,并在单击时显示有关面板内容的更多详细信息。

github链接:https://github.com/jazzband/django-debug-toolbar

文档链接:http://django-debug-toolbar.readthedocs.io/en/stable/

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.一对多

Python Web(一)

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'), ]
        )

七、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获得表里面信息的时候,它是个列表,可以利用列表的切片技术来进行内容选取而达到分页的效果

Python Web(二)的更多相关文章

  1. python web框架——扩展Django&tornado

    一 Django自定义分页 目的:自定义分页功能,并把它写成模块(注意其中涉及到的python基础知识) models.py文件 # Create your models here. class Us ...

  2. windows下python web开发环境的搭建

    windows下python web开发环境: python2.7,django1.5.1,eclipse4.3.2,pydev3.4.1 一. python环境安装 https://www.pyth ...

  3. 我的第一个python web开发框架(1)——前言

    由于之前经验不是很丰富,写的C#系统太过复杂,所以一直想重写,但学的越多越觉得自己懂的越少,越觉的底气不足.所以一直不敢动手,在内心深处对自己讲,要静下心来认真学习,继续沉淀沉淀.这两年多以来找各种机 ...

  4. python web框架之Tornado

    说Tornado之前分享几个前端不错的网站: -- Bootstrap http://www.bootcss.com/ -- Font Awesome http://fontawesome.io/ - ...

  5. Python Web框架

    本节对Python Web框架学习 一.MTVModel: 存放所有数据库相关文件Template:模板文件,存放html文件View: 业务处理,即函数文件 二.MVCmodel: 存放数据库相关文 ...

  6. Python web(Django)连接Sql server

    (开开心心每一天~ ---虫瘾师) Python Web(Django) 与SQL SERVRE的连接----Come QQ群:607021567(里面有很多开源代码和资料,并且python的游戏也有 ...

  7. Python Web(Django)与SQL SERVER的连接处理

    (开开心心每一天~ ---虫瘾师) Python Web(Django) 与SQL SERVRE的连接----Come QQ群:607021567(里面有很多开源代码和资料,并且python的游戏也有 ...

  8. 我的第一个python web开发框架(41)——总结

    我的第一个python web开发框架系列博文从17年6.7月份开始写(存了近十章稿留到9月份才开始发布),到今天结束,一年多时间,想想真不容易啊. 整个过程断断续续,中间有段时间由于工作繁忙停了好长 ...

  9. 浅谈Python web框架

    一.Python web框架 Web Framework,Ruby的世界Rails一统江湖,而Python则是一个百花齐放的世界,各种micro-framework.framework不可胜数,不完全 ...

随机推荐

  1. imageRectForContentRect,titleRectForContentRect,contentRectForBounds,imageRectForContentRect什么时候调用

    UIButton的布局顺序细节 什么时候调用imageRectForContentRect,titleRectForContentRect,contentRectForBounds,imageRect ...

  2. 安装Android Studio (一)同时配置Android Studio环境变量

    安装Android Studio 安装android 一直next就行了.这以步需要10分钟左右. 我的安卓SDK在这个目录 C:\Users\user\AppData\Local\Android\s ...

  3. Aiseesoft 4K Converter for Mac如何转换视频格式?Aiseesoft 4K使用方法

    Aiseesoft 4K如何转换视频格式?由于这款4K UHD转换器支持最新的4K编码/解码技术,因此您可以将4K视频转换为4K电视或其他设备支持的任何其他视频格式.Aiseesoft 4K使用方法分 ...

  4. Python活力练习Day4

    Day4:将列表的值按相反顺序依次输出         eg :  input : list = [1,2,3,4,5] output : [5,4,3,2,1] 方法一:时间复杂度O(n),其中 n ...

  5. STL常用结构与方法简明总结

    C++常用的数据结构 序列式容器 vector(向量.有序数列),list(双向链表),deque(双端队列) 适配器容器 stack(栈),queue(队列) 关联式容器 map(映射.键值对二叉树 ...

  6. IDEA 如何自动导入(import)

    如果大家正在使用一个未曾导入(import)过的类,或者它的静态方法或者静态字段,IDEA 会给出对应的建议,只要按下 ⌥(option)和回车就可以接受建议. 但我觉得这样做仍然很麻烦,不够智能化. ...

  7. Java描述设计模式(14):解释器模式

    本文源码:GitHub·点这里 || GitEE·点这里 一.解释器模式 1.基础概念 解释器模式是对象的行为模式.给定一个语言之后,解释器模式可以定义出其文法的一种表示,并同时提供一个解释器.客户端 ...

  8. arcgis api for javascript 学习(一) 调用在线发布的动态地图

    1.图中显示为arcgis软件中显示的地图文件 2.调用动态地图主要的是知道动态地图的URL地址 3.通过IDE(webstorm)调用动态地图,如图 4.话不多说,直接上代码 <!DOCTYP ...

  9. 《软件安装》VMware 安装 centos8

    上期问题回顾 搞技术的同学应该都听过docker,那么请问docker和虚拟机有什么区别呢? 传统的虚拟机架构是:物理机 -> 宿主机操作系统 -> Hypervisor支持 -> ...

  10. 如何通过 subprocess 持续获取输出内容

    在实际应用中会用到subprocess的Popen方法执行一些命令,而我们需要通过执行这个命令的来获取输出进行一些信息记录或者分析使用,如果是很快就可以执行完的那还好,有时需要持续跟踪内容的输出,比如 ...