Python Web(二)
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.安装
1 | pip install django-debug-toolbar |
2.配置
settings.py
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | # 将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
1 2 3 4 5 6 7 8 | 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
1 2 3 4 5 6 7 8 9 | 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
1 2 3 4 5 6 7 | 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 外键关系 |
插入信息
1 2 | models.UserInfo.objects.create(name = '张三' ,age = 12 ) models.Private.objects.create(salary = 100 ,sp_id = 1 ) |
查询
1 2 3 4 5 6 7 | #从母表查询子表中的数据 #方法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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | 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' ) ] |
插入信息
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | 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) |
查询
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | #通过关系表查询,查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
1 2 3 4 5 6 7 | 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 ) |
插入信息
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | 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)
1 | models.Boy1.objects. filter (bname = '男1' ).first().g.add( 1 , 2 , 3 , 4 , 5 , 2 ) #会自动去重保持唯一性也不会因为相同而报错 |
删除(remove)
1 | models.Boy1.objects. filter (bname = '男1' ).first().g.remove( 1 ) |
查询(all)
1 | models.Boy1.objects. filter (bname = '男1' ).first().g. all () |
清除(clear)
1 | 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数据类型对应属性
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | 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.导入模块
1 | from django.core.paginator import Paginator |
2.读取信息
1 | userlist = models.UserInfo.objects. all () |
3.生成painantor对象
生成painantor对象
1 | paginator = Paginator(userlist, 10 ) #对象,每页多少条数据 |
painantor的属性与方法
- 属性
- object_list:返回所有页对象的的列表
- per_page: 每页显示条目数量
- count:数据总个数
- num_pages:总页数
- page_range:总页数的索引范围,如: (1,10),(1,200)
- 方法
- page(第几页):page对象
4.生成page对象
生成page对象
1 | 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获得表里面信息的时候,它是个列表,可以利用列表的切片技术来进行内容选取而达到分页的效果
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 为什么说在企业级应用开发中,后端往往是效率杀手?
· 用 C# 插值字符串处理器写一个 sscanf
· Java 中堆内存和栈内存上的数据分布和特点
· 开发中对象命名的一点思考
· .NET Core内存结构体系(Windows环境)底层原理浅谈
· 为什么说在企业级应用开发中,后端往往是效率杀手?
· 本地部署DeepSeek后,没有好看的交互界面怎么行!
· 趁着过年的时候手搓了一个低代码框架
· 推荐一个DeepSeek 大模型的免费 API 项目!兼容OpenAI接口!
· 用 C# 插值字符串处理器写一个 sscanf