Python菜鸟之路:Django 路由、模板、Model(ORM)
2016-09-09 18:32
681 查看
Django路由系统
Django的路由系统让Django可以根据URI进行匹配,进而发送至特定的函数去处理用户请求。有点类似nginx的location功能。Django的路由关系分为三种:普通关系、动态关系、分组分发。这三种关系都记录在urls.py中。
路由-普通关系
普通关系表示一个url对应一个函数,例如:urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^login/', views.login), url(r'^detail/', views.detail), ]
路由-动态关系
动态关系表示通过正则的方式去实现动态匹配。例如:urlpatterns = [ url(r'^detail/(\d+)/', views.detail), # 动态路由之:单参数的路由 url(r'^detail2/(\d+)/', views.detail2), # 动态路由之:多参数的路由 url(r'^detail3/(?P<p1>\d+)/(?P<x2>\d+)/', views.detail3), # 动态路由之:命名参数,两个参数分别被命名为p1和x2 url(r'^index/(\d+)/', views.index), # 分页显示 ]
动态路由,也是动态关系的一种,动态路由其实通过映射也可以实现,需要自己来实现
三张表跨表操作 class Somthing(models.Model): name = models.CharField(max_length=32) class UserType(models.Model): catption = models.CharField(max_length=32) s = models.ForignKey('Somthing') # 超级管理员,普通用户,游客,黑河 class UserInfo(models.Model): user = models.CharField(max_length=32) pwd = models.CharField(max_length=32) user_type = models.ForignKey('UserType') # 通过Userinfo表,查询Something表中name是xx UserInfo.objects.filter(user_type__s__name='xx') # 多个下滑连通过外键__ 则可以
3张表的联表查询
Model中的多对多操作补充
Django中创建多对多关系有两种方式:
方式1:手动创建第三张表,与其他两张表建立外键关系class B2G(models.Model): b_id = models.ForeignKey('Boy') g_id = models.ForeignKey('Girl') class Boy(models.Model): username = models.CharField(max_length=16) def __str__(self): return str(self.id) class Girl(models.Model): name = models.CharField(max_length=16) def __str__(self): return str(self.id)
方式2:利用models.ManyToManyField来让django自动创建第三张表
class Boy(models.Model): username = models.CharField(max_length=16) def __str__(self): return str(self.id) class Girl(models.Model): name = models.CharField(max_length=16) b = models.ManyToManyField('Boy') def __str__(self): return str(self.id)
多对多基本操作
建立两张表的关系:即向第三张表中增加数据-获取两个对象,通过add方法建立关系########### 增加数据 ########### # 获取一个女孩对象 g1 = models.Girl.objects.get(id=1) # 获取一个男孩对象 b1 = models.Boy.objects.get(id=1) # 利用多对多字段“b”将男孩和女孩建立关系--一对一建立关系 g1.b.add(models.Boy.objects.get(id=1)) g1.b.add(1) # 也可以传入数字或者 数字列表*【1,2,3】 # 添加和女孩1和 男孩1,2,3,4关联--一对多建立关系 g1 = models.Girl.objects.get(id=1) g1.b.add(*[1,2,3,4]) # 将多个boy与女孩1建立关联 # boys = models.Boy.objects.all() # g1.b.add(*boys)
查询数据
# 获取一个女孩对象 g1 = models.Girl.objects.get(id=1) # 获取和当前女孩有关系的所有男孩 boy_list = g1.b.all() print(boy_list)
删除数据
# 删除第三张表中和女孩1关联的所有关联信息 g1 = models.Girl.objects.get(id=1) g1.b.clear() # 删除女孩1和男孩2,3的关联 g1 = models.Girl.objects.get(id=1) g1.b.remove(*[2,3])
特别补充——反向添加:由于manytomany的存在,在Boy表中,还有一个隐含字段girl_set,他的作用与Gril中的b字段是一样的功能。
b1 = models.Boy.objects.get(id=1) b1.girl_set.add(1) b1.girl_set.add(models.Girl.objects.all()) b1.girl_set.add(*[1,2,3,4])
多对多跨表操作
首先要明白一点,通过第三张表进行跨表操作,是通过left outer join的形式进行查询的,on的条件就是A表的id与B表的id相等。# 两张表关联查询 models.Girl.objects.all().values('id','name', 'b') # 查询 第三张表b的 girl.id==b.id的 b.boy_id列 SQL: SELECT "app01_girl"."id", "app01_girl"."name", "app01_girl_b"."boy_id" FROM "app01_girl" LEFT OUTER JOIN "app01_girl_b" ON ("app01_girl"."id" = "app01_girl_b"."girl_id") # 三张表关联查询-跨表查询 models.Girl.objects.all().values('id','name', 'b__username') SQL: SELECT "app01_girl"."id", "app01_girl"."name", "app01_boy"."username" FROM "app01_girl" LEFT OUTER JOIN "app01_girl_b" ON ("app01_girl"."id" = "app01_girl_b"."girl_id") LEFT OUTER JOIN "app01_boy" ON ("app01_girl_ b"."boy_id" = "app01_boy"."id")
r = models.Boy.objects.exclude(girl__name=None).values('id','username', 'girl__name') print(r) print(r.query) #SELECT "app01_boy"."id", "app01_boy"."username", "app01_girl"."name" FROM "app01_boy" LEFT OUTER JOIN "app01_girl_b" ON ("app01_boy"."id" = "app01_girl_b"."boy_id") LEFT OUTER JOIN "app01_girl" ON ("app01_girl_b". #"girl_id" = "app01_girl"."id") WHERE NOT ("app01_boy"."id" IN (SELECT U0."id" AS Col1 FROM "app01_boy" U0 LEFT OUTER JOIN "app01_girl_b" U1 ON (U0."id" = U1."boy_id") LEFT OUTER JOIN "app01_girl" U2 ON (U1."girl_i #d" = U2."id") WHERE U2."name" IS NULL))
原生SQL操作-更新
在Django的SQL ORM框架中,对于更新操作的支持并不好,因此需要借助原生的sql语句来完成更新操作
from django.db import connection cursor = connection.cursor() cursor.execute("""SELECT * from tb where name = %s""", ['Lennon']) row = cursor.fetchone()
相关文章推荐
- Python-docx安装失败
- Python 命令行解析
- Python编程的介绍
- Tensorflow学习笔记(三)MNIST初探
- python2.7,Ubuntu14.04环境下pip安装插件,cffi插件出现一下错误解决办法。
- 使用python pillow 图片转字符串
- Python中pandas函数操作数据库
- python 自动化之路 day 面向对象基础
- 序列,序列--常见BIF
- python基础(六)循环
- python--ulipad控制台中文输出乱码
- mac 系统下定时执行python脚本
- Python冒泡排序注意要点实例详解
- Python学习之路1 有序集合和无需集合
- python保存一些用户配置-put_property-get_property
- python读MySQL数据库出现中文乱码问题
- Python学习笔记 --- python将 excel 文件转化为 csv 文件 (07版本及以下 和 07版本及以上)
- python udp通信模型,模拟TFTP客户端
- python查询数据库内容
- 字符串的格式化