ORM的连表操作

基础配置 url搭建

from app import views url(r'^test.html/', views.test),

服务注册
INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', # 'app.apps.App01Config', 'app', ]

数据库配置
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.sqlite3', 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), } }

app数据表类的创建
from django.db import models# Create your models here. class Utype(models.Model): title = models.CharField(max_length=32)class Uinfo(models.Model): name = models.CharField(max_length=32) age = models.IntegerField() ut = models.ForeignKey('Utype')

view函数的创建
from app import models def test(request): #创建数据 models.Utype.objects.create(title='普通用户') models.Utype.objects.create(title='高级用户') models.Utype.objects.create(title='管理用户')models.Uinfo.objects.create(name='李伟',age=18,ut_id=1) models.Uinfo.objects.create(name='赵小亮',age=28,ut_id=2) models.Uinfo.objects.create(name='王京',age=22,ut_id=3) models.Uinfo.objects.create(name='王伟',age=12,ut_id=3) models.Uinfo.objects.create(name='李小路',age=22,ut_id=1) models.Uinfo.objects.create(name='PGone',age=22,ut_id=2) return HttpResponse('.....')

访问 访问地址,后台执行test函数,执行里面的数据的写入
ORM的连表操作
文章图片

ORM的连表操作
文章图片

数据的读取 ORM的连表操作
文章图片

连表读取用户的类型
一对一的连表查询
from app01 import models def test(request): result = models.Uinfo.objects.all() for item in result: print(item.name,item.age,item.ut.title)#这里的item.ut.title可以直接通过连表查询结果 return HttpResponse('.....')

ORM的连表操作
文章图片

多表的外键正向查询
假如数据库中是多个表通过外键关联的,我们也可以在一个表里面通过点的方式一直下去的
from django.db import models# Create your models here. class Ubumen(models.Model): caption = models.CharField(max_length=32)class Utype(models.Model): title = models.CharField(max_length=32) ucap = models.ForeignKey('Ubumen')class Uinfo(models.Model): name = models.CharField(max_length=32) age = models.IntegerField() ut = models.ForeignKey('Utype')

我们可以从uinfo表里面一直找下去的 ,如下
result = models.Uinfo.objects.all() for item in result: print(item.ut.ucap.caption)#这里就是一步一步的跨表查找下去的! return HttpResponse('.....')

反向查找 上面我们看到了uinfo设置了utype的外键,可以从uinfo里面正向的查找utype里面的内容。我们也可以通过utype,来反向查找在当前title下面的所有用户
在utype表里面默认是有一个字典,是按照外键表名字+下划线+set,组成的一个quset字段。对utype中的第一行查看所有的用户信息
obj = models.Utype.objects.all().first() for row in obj.uinfo_set.all(): print(row.name,row.age)

【ORM的连表操作】ORM的连表操作
文章图片

指定取的列数 例如,指定只取两列
models.Uinfo.objects.all().values('id','name')#这表示只取id和name这两列数据

这里出来的结果还是QuerySet不是对象了。是一个字典类型了。QuerySet[{'id':'xx','name':'xxx}],这里在for循环出来的结果就是一个一个字典了
如果是values_list拿到的结果就不是字典了,QuerySet里面是一个元祖
总结 第二种和第三种方法是不能跨表,第一种是对象形式是可以跨表的。
ORM的连表操作
文章图片

要想字典元祖的的时候也能跨表,就要在查询的时候就执行跨表,如下面的代码
ORM的连表操作
文章图片





本文转自 kesungang 51CTO博客,原文链接:http://blog.51cto.com/sgk2011/2062083,如需转载请自行联系原作者

    推荐阅读