1.路由系统优化

1.1 路由分发

前面我们已经知道,在工程名下的urls.py中写我们的路由映射关系,那么问题来了,假设我们有10个app,如果把所有的url映射都写在urls.py文件中,那么每一个app的路由都得到这里写,岂不是很麻烦?而且url多了还不好找,是吧?

所以,我们其实可以这样:

(1)在urls.py中这样写:

  1. from django.conf.urls import url
  2. from django.contrib import admin
  3. from django.conf.urls import include # 导入include
  4.  
  5. urlpatterns = [
  6. url(r'^admin/', admin.site.urls),
  7. url(r'^user/', include('user.urls')), # 格式就是 url(r'^app01/', include('app01.urls')),
  8. ]
  9. '''
  10. ----------------------------------------------------------------------------------------------
  11. # 如果有多个app,那么就写成:
  12. urlpatterns = [
  13. url(r'^admin/', admin.site.urls),
  14. url(r'^app01/', include('app01.urls')),
  15. url(r'^app02/', include('app02.urls')),
  16. url(r'^app03/', include('app03.urls')),
  17. ]
  18. ----------------------------------------------------------------------------------------------
  19. '''

(2)在到每个app目录下,新建一个同名的urls.py,在其中写到:

  1. #! /usr/bin/env python3
  2. # -*- coding:utf-8 -*-
  3.  
  4. from django.conf.urls import url
  5. from user import views # 从当前app导入view
  6.  
  7. # 下面就可以写对应的映射关系了,不过访问时url就形如:127.0.0.1:8000/user/login/了,不再是127.0.0.1:8000/login/
  8. urlpatterns = [
  9. url(r'^login/', views.login),
  10. url(r'^init/', views.db_init),
  11. url(r'^index/', views.index),
  12. url(r'^useradd/', views.user_add),
  13. url(r'^userdel/', views.user_del),
  14. url(r'^detail-(?P<nid>\d+)/', views.user_detail),
  15. url(r'^edit-(?P<nid>\d+)/', views.user_edit),
  16. url(r'^update/', views.update),
  17. url(r'^group-add/', views.group_add),
  18. url(r'^group-del/', views.group_del),
  19. ]

也就是说每个app的路由映射关系,都到了自己目录下面,是不是方便了很多?这就是路由分发。

1.2 通过路由传值

urls.py中这样写:

  1. url(r'^detail-(\d+)-(\d+).html', views.detail),

对应views.py中的函数:

  1. # 假设\d+匹配到的分别是2,9
  2.  
  3. #法1
  4. def detail(request, nid, uid):
  5.  
  6. pass
  7.  
  8. #法2
  9. def detail(request, *args):
  10. args = (2,9)
  11.  
  12. #法3
  13. def detail(request, *args, **kwargs):
  14. args = (2,9)
  15. kwargs = {}

urls.py中这样写:

  1. url(r'^detail-(?P<nid>\d+)-(?P<uid>\d+).html', views.detail)

对应views.py中的函数:

  1. def detail(request, nid, uid):
  2. pass
  3.  
  4. def detail(request, **kwargs):
  5. kwargs = {'nid': 1, 'uid': 3}
  6.  
  7. def detail(request, *args, **kwargs):
  8. args = (2,9)

2.Model

python涉及数据库操作时,我们一般都会这样处理:

(1)

  创建数据库,设计表结构和字段

  使用PyMysql来连接数据库,并且编写数据访问层代码

  业务逻辑层去调用数据访问层执行数据库操作

(2)另外就是用关系对象映射(Object Relational Mapping,简称ORM)来处理,前面我们已经学过sqlalchemy这个模块来操作数据库了,而我们强大的django也有自己的一套ORM

其他语言中:

 PHP:activerecord

 Java:Hibernate

C#:Entity Framework

django中遵循 Code Frist 的原则,即:根据代码中定义的类来自动生成数据库表。

2.1 创建表

(1)基本表结构:

  1. from django.db import models
  2.  
  3. class UserGroup(models.Model):
  4. """用户组表"""
  5. group_name = models.CharField(max_length=32) # 用户组名称

更多字段:

  1. 1models.AutoField  自增列 = int(11)
  2.   如果没有的话,默认会生成一个名称为 id 的列,如果要显示的自定义一个自增列,必须将给列设置为主键 primary_key=True
  3. 2models.CharField  字符串字段
  4.   必须 max_length 参数
  5. 3models.BooleanField  布尔类型=tinyint(1)
  6.   不能为空,Blank=True
  7. 4models.ComaSeparatedIntegerField  用逗号分割的数字=varchar
  8.   继承CharField,所以必须 max_lenght 参数
  9. 5models.DateField  日期类型 date
  10.   对于参数,auto_now = True 则每次更新都会更新这个时间;auto_now_add 则只是第一次创建添加,之后的更新不再改变。
  11. 6models.DateTimeField  日期类型 datetime
  12.   DateField的参数
  13. 7models.Decimal  十进制小数类型 = decimal
  14.   必须指定整数位max_digits和小数位decimal_places
  15. 8models.EmailField  字符串类型(正则表达式邮箱) =varchar
  16.   对字符串进行正则表达式
  17. 9models.FloatField  浮点类型 = double
  18. 10models.IntegerField  整形
  19. 11models.BigIntegerField  长整形
  20.   integer_field_ranges = {
  21.     'SmallIntegerField': (-32768, 32767),
  22.     'IntegerField': (-2147483648, 2147483647),
  23.     'BigIntegerField': (-9223372036854775808, 9223372036854775807),
  24.     'PositiveSmallIntegerField': (0, 32767),
  25.     'PositiveIntegerField': (0, 2147483647),
  26.   }
  27. 12models.IPAddressField  字符串类型(ip4正则表达式)
  28. 13models.GenericIPAddressField  字符串类型(ip4ip6是可选的)
  29.   参数protocol可以是:bothipv4ipv6
  30.   验证时,会根据设置报错
  31. 14models.NullBooleanField  允许为空的布尔类型
  32. 15models.PositiveIntegerFiel  正Integer
  33. 16models.PositiveSmallIntegerField  正smallInteger
  34. 17models.SlugField  减号、下划线、字母、数字
  35. 18models.SmallIntegerField  数字
  36.   数据库中的字段有:tinyintsmallintintbigint
  37. 19models.TextField  字符串=longtext
  38. 20models.TimeField  时间 HH:MM[:ss[.uuuuuu]]
  39. 21models.URLField  字符串,地址正则表达式
  40. 22models.BinaryField  二进制
  41. 23models.ImageField 图片
  42. 24models.FilePathField 文件

(2)连表结构:

(1)一对多:models.ForeignKey(其他表)

  应用场景:

  • 一对多:当一张表中创建一行数据时,有一个单选的下拉框(可以被重复选择)
    例如:创建用户信息时候,需要选择一个用户类型【普通用户】【金牌用户】【铂金用户】等。

示例:

  1. from django.db import models
  2.  
  3. class UserGroup(models.Model):
  4. """用户组表"""
  5. group_name = models.CharField(max_length=32) # 用户组名称
  6.  
  7. class UserInfo(models.Model):
  8. """用户信息表"""
  9. name = models.CharField(max_length=32) # 用户的姓名
  10. username = models.CharField(max_length=32) # 用户名
  11. password = models.CharField(max_length=64) # 用户密码
  12. user_type_choice = (
  13. (0, u'普通用户'),
  14. (1, u'管理员用户'),
  15. )
  16. user_type = models.IntegerField(choices=user_type_choice, default=0) # 用户类型
  17. date = models.DateField(auto_now=True) # 创建日期
  18. remark = models.CharField(max_length=64) # 备注
  19. user_group = models.ForeignKey(UserGroup) # 关联的用户组

2.2 操作表:

(1)创建表结构:

我们在modes中已经写好表的类了,那么我们可以通过命令行:

python manage.py makemigrations

python manage.py migrate

这样表结构就创建好了,如下所示:

(2)增删改查:

  1. # 示例表结构类
  2. class GroupInfo(models.Model):
  3. group_name = models.CharField(max_length=32)
  4.  
  5. class UserInfo(models.Model):
  6.  
  7. username = models.CharField(max_length=32)
  8. password = models.CharField(max_length=64)
  9.  
  10. # 创建
  11. # 法1
  12. # models.UserInfo.objects.create(username="zingp", password="123")
  13. # 法2
  14. # user_dic = {"username": "alex", "password": "123"}
  15. # models.UserInfo.objects.create(**user_dic)
  16. # 法3
  17. # obj = models.UserInfo(username="root", password="123")
  18. # obj.save()
  19.  
  20. # 查
  21. # result = models.UserInfo.objects.all() # 查询所有
  22. # result = models.UserInfo.objects.filter(username="root", password="123") # 根据条件过滤
  23. # for row in result:
  24. # print(row.id, row.username)
  25. # models.UserInfo.objects.get(id=1) # 获取单条数据,不存在则报错(不建议)
  26.  
  27. # 删除
  28. #models.UserInfo.objects.filter(username="alex").delete()
  29.  
  30. # 更新
  31. #models.UserInfo.objects.filter(id=3).update(password="8888")

python【第十九篇】Django进阶的更多相关文章

  1. Python之路(第二十九篇) 面向对象进阶:内置方法补充、异常处理

    一.__new__方法 __init__()是初始化方法,__new__()方法是构造方法,创建一个新的对象 实例化对象的时候,调用__init__()初始化之前,先调用了__new__()方法 __ ...

  2. Python之路【第十九篇】:爬虫

    Python之路[第十九篇]:爬虫   网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本.另外一些不常使用 ...

  3. 第十九章 Django的ORM映射机制

    第十九章 Django的ORM映射机制 第一课 Django获取多个数据以及文件上传 1.获取多选的结果(checkbox,select/option)时: req.POST.getlist('fav ...

  4. python第二十九课——文件读写(复制文件)

    自定义函数:实现文件复制操作有形参(2个) 没有返回值相似版(不用) def copyFile(src,dest): #1.打开两个文件:1个关联读操作,1个关联写操作 fr=open(src,'rb ...

  5. python第二十九课——文件读写(读取读取中文字符)

    演示:读取中文字符 结论: 1).如果不设置encoding,默认使用gbk进行编解码 2).如果编码和解码不一致,最终导致报错,但是一旦设置了errors='ingore',那么就不会报错,而采取乱 ...

  6. Egret入门学习日记 --- 第十九篇(书中 8.8~8.10 节 内容)

    第十九篇(书中 8.8~8.10 节 内容) 开始 8.8节. 重点: 1.类型推断. 2.类型强制转换,使其拥有代码提示功能. 3.除了TS自带的类型判断,Egret官方也提供了类型判断的方法. 操 ...

  7. Android UI开发第三十九篇——Tab界面实现汇总及比较

    Tab布局是iOS的经典布局,Android应用中也有大量应用,前面也写过Android中TAb的实现,<Android UI开发第十八篇——ActivityGroup实现tab功能>.这 ...

  8. [资料分享]Python视频教程(基础篇、进阶篇、项目篇)

    Python是一种开放源代码的脚本编程语言,这种脚本语言特别强调开发速度和代码的清晰程度.它可以用来开发各种程序,从简单的脚本任务到复杂的.面向对象的应用程序都有大显身手的地方.Python还被当作一 ...

  9. Python之路【第二十九篇】:django ORM模型层

    ORM简介 MVC或者MVC框架中包括一个重要的部分,就是ORM,它实现了数据模型与数据库的解耦,即数据模型的设计不需要依赖于特定的数据库,通过简单的配置就可以轻松更换数据库,这极大的减轻了开发人员的 ...

随机推荐

  1. MyEclipse x.x各版本终极优化配置指南

    先说优化:随着myeclipse版本不断更新,其功能不断强大,更加智能及人性化,为开发人员提供了很多便利.提高了开发速度,但是也牺牲了性能,让很多机器配置稍差的开发人员头疼不已.其实我们平时常用的功能 ...

  2. Play!framework 项目部署到Tomcat

    Play Framework有自带的服务器,也可部署到其他服务器上.这里讲解下如何将Play的项目部署到Tomcat. 1.准备war包 首先进入play目录: 比如我的: cd C:\play-1. ...

  3. VM启用ISO共享

    在SCVMM中可以启用ISO共享,如下图: 如果不勾选共享镜像复选框,则vmm会把镜像文件通过网络复制到Hyper-v主机下的虚拟机配置文件夹中 配置步骤如下: 1.新建一个共享文件夹(存放ISO), ...

  4. DirectoryExists

    判断文件夹是否存在 关键点 GetFileAttributes The GetFileAttributes function retrieves attributes for a specified  ...

  5. Android ListFragment实例Demo(自己定义适配器)

    上一篇文章介绍了ListFragment,当中的ListView并没有自己定义适配器,实际上在实际开发中常会用到自己定义适配器,是实现更复杂的列表数据展示. 所以这篇文章添加了自己定义适配器.来进行L ...

  6. [Webpack 2] Add Code Coverage to tests in a Webpack project

    How much of your code runs during unit testing is an extremely valuable metric to track. Utilizing c ...

  7. 通用块层、IO调度层以及设备驱动层的数据结构

    http://blog.chinaunix.net/uid-28897358-id-3775640.html

  8. Linux C —— 多线程

    为了防止无良网站的爬虫抓取文章,特此标识,转载请注明文章出处.LaplaceDemon/ShiJiaqi. http://www.cnblogs.com/shijiaqi1066/p/5769417. ...

  9. desc跟asc

  10. mvc给html扩展方法:

    mvc给html扩展方法: 注意:扩展方法和所在的类都必须是 public static如果在页面直接使用新扩展的方法,需要web.config里把Web.Helper名称命名空间加上,页面才能访问到 ...