13.Django之数据库models&orm连表操作补充以及其他知识点补充
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了13.Django之数据库models&orm连表操作补充以及其他知识点补充相关的知识,希望对你有一定的参考价值。
一.外键关联。假如说,现在有两张表,一张user表,这个表中存放了用户账户信息,还有一张usertype表,这张表存放了用户账户的类型。
from django.db import models
class UserType(models.Model):
#用户类型表,虽然没有创建ID字段,但是ID字段会自动创建。
type = models.CharField(max_length=32)
class User(models.Model):
#用户表
username = models.CharField(max_length=16)
password = models.CharField(max_length=100)
utype = models.ForeignKey('UserType') #创建外键,关联UserType表
#python manage.py makemigrations
#python manage.py migrate
二、插入数据。
接下来开始在表中插入数据。
from app01 import models
def test(request):
models.UserType.objects.create(type='admin')
models.UserType.objects.create(type='user')
models.User.objects.create(username='admin',password='admin',utype_id=1)
models.User.objects.create(username='aaa',password='123',utype_id=2)
models.User.objects.create(username='bbb',password='123',utype_id=2)
return HttpResponse('test')
#在User用户表中,插入了三行数据。
#在业务中可以理解为创建了三个账户,admin对应了用户admin类型,aaa,bbb对应了user也就是普通用户类型。
三、查找数据。
1.跨表查询,正向查找示例。
result = models.User.objects.all() #queryset 对象 queryset[obj,obj,obj]
for obj in result:
print(obj.username,obj.password.obj.utype_id,obj.utype.type)
输出结果如下:
admin admin 1 admin
aaa 123 2 user
bbb 123 2 user
2.跨表查询,逆向查找示例。
假如现在有一种需求,通过usertype查找用户。
示例如下:
obj = models.UserType.objects.all().first() #取出usertype表中的第一个对象
#print(obj.user_set.all()) #返回一个queryset类型的数据,会把这个类型对应的用户全部列出来。
#!!!!注意!!这个obj.user_set中的user代表的是User表,但是在django中,如果需要反向查找的话!!反向查找的表一定要小写!!然后在后面跟_set!!
print('用户类型',obj.id,obj.type)
for row in obj.user_set.all(): # obj.user_set.all()取出了所有与UserType表中第一条记录对应的用户类型,返回一个queryset类型,而此时的row变量的内容为queryset中的user对象。
print(row.username,row.password)
输出结果如下:
admin admin
#也就是说,逆向查找的方法,就是表名小写外加_set(下划线set)。
逆向查找还可以通过filter过滤:
obj = models.UserType.objects.all()
for item in obj:
print(item.type,item.user_set.filter(username='admin'))
3.关于django orm的一些补充说明。
#!返回单条记录的时候,返回的是一个和表同名的对象!#
#!在返回多条记录时,一定会返回一个queryset对象!#
关于values: Queryset[{'username':'xxx','password':'xxx'}] 将数据以字典形式返回。
result = models.User.objects,all().values('username','password') #生成一个queryset数据类型,但是这个查询结果只有username列和password列。
#不过不同的是,这里面的queryset中存放的不是一个个对象了,而是字典。 Queryset[{'username':'xxx','password':'xxx'}]
for row in result:
print(row) #获取queryset中的字典数据类型。
关于values_list:
result = models.User.objects,all().values_list('username','password')
#生成一个queryset数据类型,但是这个查询结果只有username列和password列,不同的是,这里面的queryset中存放的是元祖类型。
# Queryset[('username','xxx'),('password','xxx')]
!!在使用values和values_list时,如何跨表?
通过双下划线_ _跨表正向查找:
res = models.User.object.all().values('id','username','password','utype_ _type') #utype字段通过外键关联了UserType表,通过utype字段跨表去取UserType表中的type字段中的内容。
总结:
如果不使用values方法或者values_list方法,最后只会返回对象。
使用values方法返回字典。
使用vlaues_list方法返回的是元祖。
以上是关于13.Django之数据库models&orm连表操作补充以及其他知识点补充的主要内容,如果未能解决你的问题,请参考以下文章
Python入门自学进阶-Web框架——13Django实践小项目3