191028DjangoORM之多表操作
一、多表操作之一对多
- models.py
from django.db import models
class Book(models.Model):
name = models.CharField(max_length=30)
price = models.FloatField()
pub_date = models.DateField()
publish = models.ForeignKey('Publish',on_delete='CASCADE') #外键关联
def __str__(self):
return self.name
# 作者和书的关系是多对多的关系
class Author(models.Model):
name = models.CharField(max_length=20)
# 书和出版社的表是一对多的关系
class Publish(models.Model):
name = models.CharField(max_length=32)
city = models.CharField(max_length=32)
1、插入数据
- 方式一
Book.objects.create(name="Liunx运维手册",price=99,pub_date="2018-08-08",publish_id=2) #直接对外键_id赋值
- 方式二
publish_obj = Publish.objects.filter(name="人民出版社")[0]
Book.objects.create(name="Liunx运维手册2版",price=199,pub_date="2019-08-08",publish=publish_obj) #直接对外键赋值
2、查询数据
- 方式一
# 查询书籍是由哪个出版社出版的,正向查询
book_obj = Book.objects.get(name="python")
print(book_obj.name)
print(book_obj.pub_date)
print(book_obj.publish.name) #一对多中一定是一个对象
print(book_obj.publish.city)
print(type(book_obj.publish))
# 查询出版社出过哪些书籍,反向查询
pub_obj = Publish.objects.get(name="人民出版社")
print(pub_obj.book_set.all().values("name","price")) #多对一查到的是一个集合
- 方式二
# 查询出版社出过哪些书
ret = Book.objects.filter(publish__name="人民出版社").values("name","price")
print(ret)
# 查询书的出版社
ret = Publish.objects.filter(book__name="python").values("name")
print(ret)
ret = Book.objects.filter(name="python").values("publish__name")
print(ret)
二、多表操作之多对多(自动维护多对多关系表)
- models.py
from django.db import models
# Create your models here.
class Book(models.Model):
name = models.CharField(max_length=30)
price = models.FloatField()
pub_date = models.DateField()
publish = models.ForeignKey('Publish',on_delete='CASCADE') #外键关联
authors = models.ManyToManyField("Author") #创建表多对多的关系
def __str__(self):
return self.name
# 作者和书的关系是多对多的关系
class Author(models.Model):
name = models.CharField(max_length=20)
age = models.IntegerField(default=0)
def __str__(self):
return self.name
# 书和出版社的表是一对多的关系
class Publish(models.Model):
name = models.CharField(max_length=32)
city = models.CharField(max_length=32)
1、数据查找
- 根据书id查找作者
# 通过对象的方式创建多对多的绑定关系
book_obj = Book.objects.get(id=3)
print(book_obj.authors.all()) #这里拿到的authors是书对应作者的对象
- 根据作者id查找书名
author_obj = Author.objects.get(id=2)
print(author_obj.book_set.all())
- 使用双下划线进行关联查询
ret = Book.objects.filter(authors__name="maria").values("name","price")
print(ret)
2、添加对应关系
book_obj = Book.objects.get(id=5) #获取书的对象
author_objs = Author.objects.get(id=3) #获取作者的对象
book_obj.authors.add(author_objs) #将作者对象加入到书的对应作者对象中,如果author_objs是一个集合则需要book_obj.authors.add(*author_objs)这样写
3、删除对应关系
book_obj = Book.objects.get(id=5)
author_objs = Author.objects.get(id=3)
book_obj.authors.remove(author_objs)
三、多表操作之多对多(手动维护多对多关系表)
- models.py
from django.db import models
# Create your models here.
class Book(models.Model):
name = models.CharField(max_length=30)
price = models.FloatField()
pub_date = models.DateField()
publish = models.ForeignKey('Publish',on_delete='CASCADE') #外键关联
# authors = models.ManyToManyField("Author") #创建表多对多的关系
def __str__(self):
return self.name
# 作者和书的关系是多对多的关系
class Author(models.Model):
name = models.CharField(max_length=20)
age = models.IntegerField(default=0)
def __str__(self):
return self.name
# 创建作者和书的关系绑定表
class Book_Author(models.Model):
book = models.ForeignKey("Book",on_delete="CASCADE")
author = models.ForeignKey("Author",on_delete="CASCADE")
# 书和出版社的表是一对多的关系
class Publish(models.Model):
name = models.CharField(max_length=32)
city = models.CharField(max_length=32)
- 添加/查询关系
Book_Author.objects.create(book_id=1,author_id=2)
obj = Book.objects.get(id=1)
print(obj.book_author_set.all()[0].author)
- 查询作者的书籍
ret = Book.objects.filter(book_author__author__name='maria').values("name","price")
print(ret)
四、聚合和分组查询
- 聚合
from django.db.models import Avg,Min,Sum,Max,Count
print(Book.objects.all().aggregate(Avg("price"))) #求平均值
print(Book.objects.all().aggregate(Sum("price"))) #求和
print(Book.objects.filter(authors__name="maria").aggregate(Sum("price"))) #求和
print(Book.objects.filter(authors__name="maria").aggregate(Count("name")))
- 分组
print(Book.objects.values("authors__name").annotate(Sum("price"))) #按照author_name分组后将price做求和
print(Publish.objects.values("name").annotate(Min("book__price")))
- F函数
from django.db.models import Avg,Min,Sum,Max,Count,F
Book.objects.all().update(price=F("price")*2) #将书的价格翻一倍
- Q函数
from django.db.models import Avg,Min,Sum,Max,Count,F,Q
print(Book.objects.filter(Q(price=178)|Q(name="python"))) #或
print(Book.objects.filter(Q(price=178)| ~Q(name="python"))) #或非
191028DjangoORM之多表操作的更多相关文章
- Mysql常用表操作 | 单表查询
160905 常用表操作 1. mysql -u root -p 回车 输入密码 2. 显示数据库列表 show databases 3. 进入某数据库 use database data ...
- Sql Server系列:数据表操作
表是用来存储数据和操作数据的逻辑结构,用来组织和存储数据,关系数据库中的所有数据都表现为表的形式,数据表由行和列组成.SQL Server中的数据表分为临时表和永久表,临时表存储在tempdb系统数据 ...
- 学习MySQL之单表操作(二)
##单表操作 ##创建表 CREATE TABLE t_employee( empno ), ename ), job ), MGR ), Hiredate DATE DEFAULT '0000-00 ...
- python——Django(ORM连表操作)
千呼万唤始出来~~~当当当,终于系统讲了django的ORM操作啦!!!这里记录的是django操作数据库表一对多.多对多的表创建及操作.对于操作,我们只记录连表相关的内容,介绍增加数据和查找数据,因 ...
- mysql数据表操作&库操作
首先登陆mysql:mysql -uroot -proot -P3306 -h127.0.0.1 查看所有的库:show databases; 进入一个库:use database; 显示所在的库:s ...
- SQL server基础知识(表操作、数据约束、多表链接查询)
SQL server基础知识 一.基础知识 (1).存储结构:数据库->表->数据 (2).管理数据库 增加:create database 数据库名称 删除:drop database ...
- Python之Django--ORM连表操作
一对多 class UserType(models.Model): caption = models.CharField(max_length=32) class UserInfo(models.Mo ...
- spark使用Hive表操作
spark Hive表操作 之前很长一段时间是通过hiveServer操作Hive表的,一旦hiveServer宕掉就无法进行操作. 比如说一个修改表分区的操作 一.使用HiveServer的方式 v ...
- [SAP ABAP开发技术总结]内表操作
声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...
随机推荐
- Git复习(二)之远程仓库、注册GitHub账号、SSH警告、使用GitHub
远程仓库 Git是分布式版本控制系统,同一个Git仓库,可以分布到不同的机器上.怎么分布呢?最早,肯定只有一台机器有一个原始版本库,此后,别的机器可以“克隆”这个原始版本库,而且每台机器的版本库其实都 ...
- 常用Java字段的正则校验
正则表达式: 单个字符的匹配规则如下: 多个字符的匹配规则如下: 复杂匹配规则主要有: 常用正则表达式校验规则: 一.校验数字的表达式 1.数字:^[0-9]*$ 2.n位的数字:^\d{n}$ 3. ...
- luogu P2154 [SDOI2009]虔诚的墓主人
luogu 下面记一个点上下左右点数分别为\(u_i,d_i,l_i,r_i\) 枚举每个中间点太慢了,考虑枚举两个点之间横的一条线段,这里面的点左边点数目都相同,右边点数目都相同,然后只要查一下区间 ...
- colaui基础
监控 c-watch // 监控的方法函数 on 监控的参数名字 div(c-watch="fun on style" c-bind="styles") // ...
- Dedecms 生成速度慢 的解决办法
从dedecms官网论坛找到个合适的代码 include/inc/inc_fun_SpGetArcList.php for($i=0;$i<$ridnum;$i++){ if($tpsql==& ...
- docker常用命令与容器创建
################docker安装##################### Docker从1.13版本之后采用时间线的方式作为版本号,分为社区版CE和企业版EE. 社区版是免费提供给个 ...
- springboot集成dubbo服务报错No provider available for the service
检查了下发现是因为没有正确编写暴露服务的注解,需要注意下: @Service(interfaceClass = StudentService.) @Component public class Stu ...
- Codeforces Manthan, Codefest 18 (rated, Div. 1 + Div. 2) E.Trips
比赛的时候想到怎么做了 没调出来(感觉自己是个睿智) 给你N个点M条边,这M条边是一条一条加进去的 要求你求出加入每一条边时图中极大'K度'子图的大小 极大'K度'子图的意思是 要求出一个有尽量多的点 ...
- 阿里云-docker安装mysql
1.检查内核版本,必须是3.10及以上 uname ‐r 2.安装docker yum install docker 3.输入y确认安装 4.启动docker:service docker start ...
- 权限和ACL访问控制 -01-权限
权限位 rwxrwrwx:左三位:定义user(owner)的权限,属主权限中三位:定义group的权限,属组权限有三位:定义other的权限,其他的权限 进程对文件的访问权限应用模型:进程的属主与文 ...