模型类

class Book(models.Model):nid = models.AutoField(primary_key=True)title = models.CharField(max_length=32, default=None)create_time = models.DateTimeField()price = models.DecimalField(decimal_places=2, max_digits=8, default=None)publish_id = models.ForeignKey(to="Publish", on_delete=models.CASCADE)authors = models.ManyToManyField(to='Author')def __str__(self):return str(self.nid) + ':' + self.titleclass Publish(models.Model):nid = models.AutoField(primary_key=True)name = models.CharField(max_length=32)email = models.CharField(max_length=32)class Author(models.Model):name = models.CharField(max_length=32)age = models.IntegerField()email = models.CharField(max_length=32)ad = models.OneToOneField(to="AuthorDetail", on_delete=models.CASCADE)class AuthorDetail(models.Model):address = models.CharField(max_length=32)telephone = models.IntegerField()

批量插入

book_list = []for i in range(100):book = Book(title='book_%s' % i, price=i * i)book_list.append(book)Book.objects.bulk_create(book_list)

一对多和多对多 添加操作

# 一对多添加用户
publish = Publish.objects.get(nid=1)
Book.objects.create( title='ubuntu',price=122, create_time='2012-2-2', publish_id=publish, # publish_id_id=publish.nid  )
# 多对多添加用户
author01 = Author.objects.get(id="1")
author02 = Author.objects.get(id="2")book = Book.objects.get(nid='2')
# book.authors.add(author01, author02)
# 多对多第二种
book.authors.add(1, 2)
# 多对多第三种
book.authors.add(*[1, 2])
# 删除关联的作者
 book.authors.remove(author01)
# 删除所有关联的作者
 book.authors.clear()
# 先删除所有在绑定
book.authors.set(1)

查询操作

基于对象的跨表查询(基于子查询)

# 一对多查询# 正查book = Book.objects.get(nid='1')# 取到关联的对象publish = book.publish_idprint(publish.name)# 反查publish = Publish.objects.get(nid='1')books = publish.book_set.all()# 多对多查询book = Book.objects.get(nid='1')authors = book.authors.all()author = Author.objects.get(id='1')book = author.book_set.all()# 一对一author = Author.objects.get(id='1')ad = author.adauthor_detail = AuthorDetail.objects.get(id='1')author = author_detail.author

# 基于双下划线的跨表查询(基于join实现的)
# KEY:正向查询按字段,反向查询按表明小写

# linux这本书的出版社名字# 正向name = Book.objects.filter(title='linux').values('publish_id__name')# 反向name = Publish.objects.filter(book__title='linux').values('name')# 查询第一个出版社对用的所有书# 正向book = Publish.objects.filter(nid='1').values('book__title')# 反向book = Book.objects.filter(publish_id_id='1').values('title')# 查询Linux这本书所有作者的手机号telephone = Book.objects.filter(title='linux').values('authors__ad__telephone')telephone = Author.objects.filter(book__title='linux').values('ad__telephone')# 查询id=1的出版社的作者的书籍和作者的名字title_name = Publish.objects.filter(nid='1').values('book__authors__name', 'book__title')title_name = Book.objects.filter(publish_id_id=1).values('title', 'authors__name')# 查询作者手机号的开头为110的书籍和出版社名称title_name = Author.objects.filter(ad__address__startswith='北京').values('book__title', 'book__publish_id__name')

# 聚合和分组

from django.db.models import Avg, Max, Sum, Min, Countavg = Book.objects.all().aggregate(price=Avg('price'))# 单表分组查询# 查询每个出版社id以及对应大的书籍个数count = Book.objects.values('publish_id').annotate(count=Count(1))# values中的值为分类的参数'''select Count(1) from Book GROUP by publish_id'''# 跨表分组查询# 查看每一个出版社名称以及对应的书籍个数count = Book.objects.values('publish_id__name').annotate(count=Count(1))count = Publish.objects.values('name').annotate(c=Count('book__nid'))# 查找作者大于一个的书籍对应的作者数query = Book.objects.annotate(c=Count('authors')).filter(c__gt=1).values('c', 'title')

转载自:https://www.cnblogs.com/ls1997/p/10970583.html

转载于:https://www.cnblogs.com/wyhluckdog/p/11383234.html

django模型篇:一对一、一对多、多对多,添加,批量插入和查询操作相关推荐

  1. 7. MyBatis多表查询 - 一对一 - 一对多 - 多对多

    7. MyBatis多表查询 - 一对一 - 一对多 - 多对多 前言 在前面的篇章,我们已经熟悉了单表查询,下面我们来看看如何进行 多表查询. 数据准备 create database if not ...

  2. mybatis的一对一 一对多 多对多

    mybatis的一对一 一对多 多对多 1.表 2.建表语句 order_t表 CREATE TABLE `order_t` ( `id` int(11) NOT NULL, `user_id` in ...

  3. SQLAlchemy_定义(一对一/一对多/多对多)关系

    SQLAlchemy_定义(一对一/一对多/多对多)关系 目录 Basic Relationship Patterns One To Many One To One Many To Many Basi ...

  4. Python进阶----表与表之间的关系(一对一,一对多,多对多),增删改查操作

    Python进阶----表与表之间的关系(一对一,一对多,多对多),增删改查操作,单表查询,多表查询 一丶表与表之间的关系 背景: ​ ​ ​  ​ ​ 由于如果只使用一张表存储所有的数据,就会操作数 ...

  5. Django一对一 ,一对多,多对多

    Django 数据库一对多,多对多 目录 app01/models.py app01/views.py app01/urls.py Python_Django/urls.py 目录 app01/mod ...

  6. day 69-70 一对一 一对多 多对一联表查询

    day 69 orm操作之表关系,多对多,多对一多对一/一对多,多对多{类中的定义方法}day691. 昨日内容回顾1. 单表增删改查2. 单表查询API返回QuerySet对象的:1. .all() ...

  7. JPA 一对一 一对多 多对一 多对多配置

    1 JPA概述 1.1 JPA是什么 JPA (Java Persistence API) Java持久化API.是一套Sun公司 Java官方制定的ORM 方案,是规范,是标准 ,sun公司自己并没 ...

  8. Mybatis一对多、多对一、批量插入

    在项目开发中,我们有遇到的对象关系通常是复杂的,每个对象并不是单独的.比如学生和老师之间关系,一个老师有多个学生,每个学生会对应一个老师(这里的老师主要是班主任),这种关系其实就是一对多的关系.Myb ...

  9. JAVA日记之mybatis-3一对一,一对多,多对多xml与注解配置 ----喝最烈的酒.

    1.Mybatis多表查询 1.1 一对一查询 1.1.1 一对一查询的模型 用户表和订单表的关系为,一个用户有多个订单,一个订单只从属于一个用户 一对一查询的需求:查询一个订单,与此同时查询出该订单 ...

  10. 初学者易上手的SSH-hibernate04 一对一 一对多 多对多

    这章我们就来学习下hibernate的关系关联,即一对一(one-to-one),一对多(one-to-many),多对多(many-to-many).这章也将是hibernate的最后一章了,用于初 ...

最新文章

  1. Flask-RESTful之响应处理
  2. 一小时讲懂图神经网络在分子上的应用
  3. GIF Movie Gear V4.2.3 破解版
  4. Interesting Finds: 2008.03.17
  5. docker部署项目 dockerfile 实战 SpringBoot、flask
  6. android 原生砸金蛋 动画,C4D-砸金蛋动画效果制作
  7. 操作系统(十六)调度算法(一)
  8. python识别文字tesseract
  9. Webgoat学习笔记1
  10. Java代码一行一行读取txt的内容
  11. 软硬件协同仿真——硬件加速
  12. 提升文学素养【文章解读】
  13. 2. evaluate-reverse-polish-notation
  14. Longest Common Subsequence
  15. 杀戮尖塔是用java_杀戮尖塔修改class文件图文教程
  16. mac word 保存文件丢失,明明保存啦,但是就是没啦,不见啦。这个怎么解决。
  17. Allegro PCB Design GXL (legacy) - 更新 PCB 中的元件封装
  18. thinkPHP3.2.3使用163邮箱发送邮件
  19. Android 客户端直播实现
  20. UVA 1218 完美的服务

热门文章

  1. 做软件也是要有点追求的
  2. mysql like BR%._MySQL Like子句
  3. Thread 类的属性和方法
  4. openstack创建的实例不能使用ssh登录
  5. 公众号笔记: 2018年12月
  6. Xcode9使用新体验
  7. MySQL数据库基础(三)——SQL语言
  8. 【网络原理】期末复习笔记 第一章 概述
  9. centos django mysql安装
  10. Why do people love certain websites and web products?