您的位置:首页 > 编程语言 > Python开发

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()
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: