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方法返回的是元祖。


      本文转自苏浩智 51CTO博客,原文链接:http://blog.51cto.com/suhaozhi/2067055,如需转载请自行联系原作者




相关文章
|
4月前
|
关系型数据库 MySQL 数据库
ORM对mysql数据库中数据进行操作报错解决
ORM对mysql数据库中数据进行操作报错解决
102 2
|
1月前
|
SQL 定位技术 数据库
深入探索Django ORM:高效数据库操作的秘诀####
本文旨在为读者揭开Django ORM(对象关系映射)的神秘面纱,通过一系列生动的比喻和详实的案例,深入浅出地讲解其核心概念、工作原理及高级特性。我们将一起探讨如何利用Django ORM简化数据库交互,提升开发效率,同时确保数据的一致性和安全性。不同于传统的技术文档,本文将以故事化的形式,带领读者在轻松愉快的氛围中掌握Django ORM的精髓。 ####
|
2月前
|
SQL 监控 数据库
深入探索Django ORM:高效数据操作的秘诀与实践####
在当今的Web开发领域,提升数据访问层的效率是优化应用性能的关键。本文旨在通过剖析Django框架中的ORM(对象关系映射)机制,揭示其如何简化数据库交互,并探讨一系列高级技巧与策略,帮助开发者构建更高效、可维护的数据访问代码。我们不涉及安装步骤或基础概念,而是聚焦于实战经验分享,旨在为中高级开发者提供深度洞见。 ####
|
3月前
|
SQL Java 数据库
Django学习三:views业务层中通过models对实体对象进行的增、删、改、查操作。
这篇文章是关于如何使用Django框架的ORM系统在视图(views)层面进行数据库的增、删、改、查操作的教程。
31 0
Django学习三:views业务层中通过models对实体对象进行的增、删、改、查操作。
|
3月前
|
关系型数据库 MySQL Java
Django学习二:配置mysql,创建model实例,自动创建数据库表,对mysql数据库表已经创建好的进行直接操作和实验。
这篇文章是关于如何使用Django框架配置MySQL数据库,创建模型实例,并自动或手动创建数据库表,以及对这些表进行操作的详细教程。
112 0
Django学习二:配置mysql,创建model实例,自动创建数据库表,对mysql数据库表已经创建好的进行直接操作和实验。
|
4月前
|
存储 关系型数据库 MySQL
【阿里规约】阿里开发手册解读——数据库和ORM篇
从命名规范、建表规范、查询规范、索引规范、操作规范等角度出发,详细阐述MySQL数据库使用过程中所需要遵循的各种规范。
|
3月前
|
SQL Go 数据库
【速存】深入理解Django ORM:编写高效的数据库查询
【速存】深入理解Django ORM:编写高效的数据库查询
94 0
|
4月前
|
数据库 Python
django中数据库外键可以自定义名称吗
django中数据库外键可以自定义名称吗
|
5月前
|
Java 数据库连接 数据库
告别繁琐 SQL!Hibernate 入门指南带你轻松玩转 ORM,解锁高效数据库操作新姿势
【8月更文挑战第31天】Hibernate 是一款流行的 Java 持久层框架,简化了对象关系映射(ORM)过程,使开发者能以面向对象的方式进行数据持久化操作而无需直接编写 SQL 语句。本文提供 Hibernate 入门指南,介绍核心概念及示例代码,涵盖依赖引入、配置文件设置、实体类定义、工具类构建及基本 CRUD 操作。通过学习,你将掌握使用 Hibernate 简化数据持久化的技巧,为实际项目应用打下基础。
385 0