Django之model补充:一对多、跨表操作
表结构概述
model.py :
class Something(models.Model):
name = models.CharField(max_length=32)
class UserType(models.Model):
caption = models.CharField(max_length=32)
s = models.ForeignKey('Something')
# 超级管理员,普通用户,游客,黑河
class UserInfo(models.Model):
user = models.CharField(max_length=32)
pwd = models.CharField(max_length=32)
user_type = models.ForeignKey('UserType')
# user_type_id
关系:
- something --> usertype 一对多
- usertype --> userinfo 一对多
表单中的数据:
something:
| id | name |
|---|---|
| 1 | something1 |
| 2 | something2 |
usertype:
| id | caption | something_id |
|---|---|---|
| 1 | 超级管理员 | 1 |
| 2 | 普通管理员 | 1 |
| 3 | 黑客 | 2 |
userinfo:
| id | user | pwd | usertype_id |
|---|---|---|---|
| 1 | alex | 123 | 1 |
| 2 | eric | 123 | 2 |
简要说明
Django中:
- 某表中foreignkey关联另一张表后,会自动在本表单中创建一个名称为另一张表的列:xxx_id
- 一对多创建时,foreignkey需要使用在一对多中的多的表单中
查询
userinfo_obj = UserInfo.objects.all()
结果为一个类的列表,类似:[UserInfo对象,UserInfo对象,]
以上语句会得到的数据为一个元素为查询目标表单对象的列表,所以例子中的userinfo_obj为一个queryset对象我们可以通过`print(userinfo_obj.query)来查看SQL语句.
取值
比较简单:
id = userinfo_obj[0].user.id
user = userinfo_obj[0].user.user
pwd = userinfo_obj[0].user.pwd
...
values与vlue_list
queryset = UserInfo.objects.all().values('user')
结果:
[{‘user’: 'alex'},{‘user’: 'eirc'}]
=================================
queryset = UserInfo.objects.all().value_list('user')
结果:
[('alex'),('eirc')]
查询中:
- 使用values('列名称'),结果为字典组成的列表
- 使用value_list('列名称'),结果为元组组成的列表
所以,未来操作中,我们可以使用这两个方便的东西来遍历字典取值还是使用元组取值
一对多操作
创建数据
一般我们是来这么做的:
UserInfo.objects.create(user='cc',
'pwd' = '123'
user_type=UserType.objects.get(id=2))
很麻烦吧,其实是两步操作了,但因为建表时有了user_type_id,所以我们可以这么搞:
UserInfo.objects.create(user='cc','pwd'='123',user_type_id=2)
很简单吧...
数据查询
单表查询:
UserInfo.objects.filter(user='alex')
反向查询
需求:查询所有用户类型等于 普通用户 的所有用户名和密码
两步操作:
uid = UserType.objects.filter(caption='普通用户')
userinfo_obj = UserInfo.objects.filter(user_type_id=uid)
两步操作很简单,那就引出了神奇的双下划线:__
queryset = UserInfo.objcets.filter(user_type__caption='普通用户')
###结果
[UserInfo对象,UserInfo对象,UserInfo对象,]
row = queryset[0] #取到一个元素
user = row.user
password = row.pwd #取到具体信息
row.user_type.id
row.user_type.caption
总结下:
- 一对多中,正下查询使用foreignkey 的 _id 查询:row.外键字段.外键表的字段
- 一对多中反向查询,首先还是在在一对多中的多的表单中查询,可以使用
__连接相关表中的列名去查询:row__
其实感觉__有点像关系连线的意思
queryset = UserInfo.objects.filter(user_type__caption='普通用户').values('user','pwd','user_type__caption')
####结果
[{'user':'alex','pwd':'123','user_type__caption':'普通用户'}{'user':'eric','pwd':'123','user_type__caption':'普通用户'}]
三张表跨表操作
跟上面一样,直接用__即可
queryset = UserInfo.objects.filter(user_type__s__name='xxx')
进阶操作
获取个数:
UserInfo.objects.filter(name = 'alex').count()
大于小于,还是使用双下划线__
UserInfo.objects.filter(id__gt=2) #获取ID大于2的数据
UserInfo.objects.filter(id__lt=5) #获取ID小余5的数据
UserInfo.objects.filter(id__gt=2,id__lt=5) #获取ID大于2小于5的数据
in:
UserInfo.objects.filter(id__in=[11,22,33]) #获取id等于11、22、33的数据
UserInfo.objects.exclude(id__in=[11,22,33]) #not in
contains(包含):
UserInfo.objects.filter(name__contains="ven") #获取name列中包含'ven'的数据
UserInfo.objects.filter(name__icontains="Ven") #获取name列中包含'ven'的数据,对大小写不敏感
UserInfo.objects.exclude(name__icontains="ven") #不包含
range:
UserInfo.objects.filter(id__range=[1,10]) #范围,between and ,获取id在1到10范围中的数据
Django之model补充:一对多、跨表操作的更多相关文章
- django(3) 一对多跨表查询、ajax、多对多
1.一对多跨表查询获取数据的三种形式:对象.字典.元组 例:有host与business两张表,host与business的id字段关联,business在host表中的对象名是b, 通过查询hos ...
- Django - 一对多跨表操作
1.views.py 2.host.html 运行结果: 通过外键,来进行多表取值(多表取值包括后台取值及前端获取): 多表获取数据时,可以通过以下几种方式实现: 1.从query set 中获取某 ...
- Django之model联表:一对多、跨表操作,联表查询
表结构概述 model.py : class Something(models.Model): name = models.CharField(max_length=32) class UserTyp ...
- 五、Django学习之基于对象的跨表查询
五.Django学习之基于对象的跨表查询 正向与反向查询 关键在于ForeignKey字段写的位置.例如下面这段代码, 关系属性(字段)写在哪个类(表)里面,从当前类(表)的数据去查询它关联类(表)的 ...
- c# 数据库编程(利用DataSet 和 DataAdaper对象操作数据库--跨表操作)
上篇文章我们介绍了如何利用DataSet 和 DataAdaper对象来对单张表进行操作. 本文我们将介绍如何进行跨表操作. 我们通过具体例子方式进行演示,例子涉及到三张表. 1)student表(学 ...
- Django之ORM跨表操作
Django之ORM表查询及添加记录 一.创建表 - 书籍模型: 书籍有书名和出版日期,一本书可能会有多个作者,一个作者也可以写多本书,所以作者和书籍的关系就是多对多的关联关系(many-to-man ...
- Django【第7篇】:Django之ORM跨表操作(聚合查询,分组查询,F和Q查询等)
django之跨表查询及添加记录 一:创建表 书籍模型: 书籍有书名和出版日期,一本书可能会有多个作者,一个作者也可以写多本书,所以作者和书籍的关系就是多对多的关联关系(many-to-many); ...
- django框架基础-ORM跨表操作-长期维护
############### 一对一跨表查询 ################ import os if __name__ == '__main__': os.environ.setde ...
- Django学习笔记(7)——单表操作和多表操作
单表操作 1,创建模型 创建名为book的APP,在book下的models.py中创建模型: from django.db import models # Create your models he ...
随机推荐
- java TCP 通信:服务端与客服端
1.首先先来看下基于TCP协议Socket服务端和客户端的通信模型: Socket通信步骤:(简单分为4步) 1.建立服务端ServerSocket和客户端Socket 2.打开连接到Socket的输 ...
- TeX Live安装指南
若要安装 TeXLive ,推荐下载 TeXLive 的 ISO 镜像,因为在线安装下载过程会很慢.如果网速快也可以在线安装.下载地址:http://mirror.ctan.org/systems/t ...
- 编写一个c程序来计算整数中的设置位数?
回答: unsigned int NumberSetBits(unsigned int n) { ; while (n) { ; ; } return CountSetBits; } 本质上就是计算n ...
- HTML 002 基础
HTML 基础- 4个实例 HTML 标题 HTML 标题(Heading)是通过<h1> - <h6> 标签来定义的. 实例 <h1>这是一个标题</h1& ...
- 重载new和delete运算符
内存管理运算符 new.new[].delete 和 delete[] 也可以进行重载,其重载形式既可以是类的成员函数,也可以是全局函数.一般情况下,内建的内存管理运算符就够用了,只有在需要自己管理内 ...
- exam9.6&&7
emmm 改题稍紧张,以后几篇并一起写 9.6 (前十并没有参加本次考试) 于是我就rank8了 一道题一道题来 先说T1: 显然是一个高精度GCD,于是打算用计算器算一下时间复杂度 众所周知gcd是 ...
- Java基础系列 - JAVA集合ArrayList,Vector,HashMap,HashTable等使用
package com.test4; import java.util.*; /** * JAVA集合ArrayList,Vector,HashMap,HashTable等使用 */ public c ...
- ros资料记录,详细阅读
ROS源码分析--子话题-catkin:https://blog.csdn.net/sukha/article/details/52460492 ROS源码分析:https://blog.csdn.n ...
- TopCoder SRM 582 Div 1 - Problem 1000 SemiPerfectPower
首先我们可以把答案差分,那么我们只需要求出\(1\)~\(x\)范围内的满足条件的数即可. 题目要求的应该是这个东西的个数: \(l \leq a*b^c \leq r(1 \le a < b) ...
- 详解css3 pointer-events(阻止hover、active、onclick等触发事件来
pointer-events 更像是JavaScript,它能够: 阻止用户的点击动作产生任何效果 阻止缺省鼠标指针的显示 阻止CSS里的 hover 和 active 状态的变化触发事件 阻止Jav ...