欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Python Web(二)

程序员文章站 2022-10-04 11:23:22
Infi-chu: http://www.cnblogs.com/Infi-chu/ 一、Django-debug-toolbar django-debug-toolbar 是一组可配置的面板,可显示有关当前请求/响应的各种调试信息,并在单击时显示有关面板内容的更多详细信息。 github链接:ht ......

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

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