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'),
}
}
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')
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('.....')
一对一的连表查询
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('.....')
多表的外键正向查询
假如数据库中是多个表通过外键关联的,我们也可以在一个表里面通过点的方式一直下去的
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)
例如,指定只取两列
models.Uinfo.objects.all().values('id','name')#这表示只取id和name这两列数据
这里出来的结果还是QuerySet不是对象了。是一个字典类型了。QuerySet[{'id':'xx','name':'xxx}],这里在for循环出来的结果就是一个一个字典了
如果是values_list拿到的结果就不是字典了,QuerySet里面是一个元祖
第二种和第三种方法是不能跨表,第一种是对象形式是可以跨表的。
要想字典
和元祖
的的时候也能跨表,就要在查询的时候就执行跨表,如下面的代码
本文转自 kesungang 51CTO博客,原文链接:http://blog.51cto.com/sgk2011/2062083,如需转载请自行联系原作者