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的连表操作

指定取的列数

例如,指定只取两列

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,如需转载请自行联系原作者