一、多表操作之一对多

  • 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之多表操作的更多相关文章

  1. Mysql常用表操作 | 单表查询

    160905 常用表操作 1. mysql -u root -p 回车 输入密码   2. 显示数据库列表 show databases     3. 进入某数据库 use database data ...

  2. Sql Server系列:数据表操作

    表是用来存储数据和操作数据的逻辑结构,用来组织和存储数据,关系数据库中的所有数据都表现为表的形式,数据表由行和列组成.SQL Server中的数据表分为临时表和永久表,临时表存储在tempdb系统数据 ...

  3. 学习MySQL之单表操作(二)

    ##单表操作 ##创建表 CREATE TABLE t_employee( empno ), ename ), job ), MGR ), Hiredate DATE DEFAULT '0000-00 ...

  4. python——Django(ORM连表操作)

    千呼万唤始出来~~~当当当,终于系统讲了django的ORM操作啦!!!这里记录的是django操作数据库表一对多.多对多的表创建及操作.对于操作,我们只记录连表相关的内容,介绍增加数据和查找数据,因 ...

  5. mysql数据表操作&库操作

    首先登陆mysql:mysql -uroot -proot -P3306 -h127.0.0.1 查看所有的库:show databases; 进入一个库:use database; 显示所在的库:s ...

  6. SQL server基础知识(表操作、数据约束、多表链接查询)

    SQL server基础知识 一.基础知识 (1).存储结构:数据库->表->数据 (2).管理数据库 增加:create database 数据库名称 删除:drop database ...

  7. Python之Django--ORM连表操作

    一对多 class UserType(models.Model): caption = models.CharField(max_length=32) class UserInfo(models.Mo ...

  8. spark使用Hive表操作

    spark Hive表操作 之前很长一段时间是通过hiveServer操作Hive表的,一旦hiveServer宕掉就无法进行操作. 比如说一个修改表分区的操作 一.使用HiveServer的方式 v ...

  9. [SAP ABAP开发技术总结]内表操作

    声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...

随机推荐

  1. php 技术点积累

    PHP 反射之动态代理 php跨域的几种方式 给 PHP 开启 shmop 扩展实现共享内存 php十进制转二进制不用函数 php+nodeJs+thrift协议,实现zookeeper节点数据自动发 ...

  2. EJS学习(一)之特性、安装、工作原理

    前言 EJS,"E" 代表 "effective",即[高效],EJS 是一套简单的JavaScript模板,EJS 没有如何组织内容的教条:也没有再造一套迭代 ...

  3. ABCD 谁是小偷

    题目: 警察局抓了a,b,c,d 4名偷窃嫌疑犯,其中只有一人是小偷.审问中,a说:“我不是小偷.”b说:“c是小偷.”c说:“小偷肯定是d.”d说:“c在胡说.” 现在已经知道这四人中有三人说的是真 ...

  4. 098、Swarm 如何实现 Failover (Swarm05)

    参考https://www.cnblogs.com/CloudMan6/p/7898245.html   故障是在所难免的,容器可能崩溃,Docker Host 可能宕机,不过幸运的是,Swarm 已 ...

  5. oppo 手机不能连接appium,提示does not have permission android.permission.CLEAR_APP_USER_DATA to clear data

    1)增加配置项noReset=true 2)除了常见开发者选项中打开usb调试,同时还需要开启以下2项,然后重启手机即可

  6. Django框架——基础之模型系统(ORM相关操作)

    ------------恢复内容开始------------ 1.必定会的十三条! 1.1记忆方法一:(按字母顺序记忆)   <1> all(): 查询所有结果 <2> cou ...

  7. 多线程编程-- part 9 信号量:Semaphore

    Semaphore简介 Semaphore是一个计数信号量,它的本质是一个"共享锁". 信号量维护了一个信号量许可集.线程可以通过调用acquire()来获取信号量的许可:当信号量 ...

  8. SAP中MM模块基础数据之Quota Arrangement(配额协议)的解析

    有的时候我们的采购部门有这样的需求, 同一颗物料有几个供应商同时供料, 这个时候就涉及到一个问题, 避免出现总是和一家供应商购买物料的情况,我们需求把这些物料按照一定的比列分配给供应商.在SAP系统中 ...

  9. 【AGC 036C】GP2

    https://atcoder.jp/contests/agc036/tasks/agc036_c 题意 有一个长度为 $n$ 的非负整数序列 $x$,初始时全为 $0$.一次操作定义为选择一对正整数 ...

  10. Tableau Sheet

    通过Tableau Sheet自带的超市数据给出几种图表. 在左侧数据Data栏有一列是Dimenslons是维度,下面Measures是测度,维度可以理解为你需要筛选的条件,比如根据年份看,根据地区 ...