首先来创建一个模型,数据库的关系就清楚了

models.py

from django.db import models

# Create your models here.

class Author(models.Model):

    id = models.AutoField(primary_key=True)
name = models.CharField(max_length=32)
age = models.IntegerField()
au = models.OneToOneField(to='AuthorDetail',to_field='id',on_delete=models.CASCADE) class AuthorDetail(models.Model): id = models.AutoField(primary_key=True)
address = models.CharField(max_length=32)
tel = models.CharField(max_length=11) class Publish(models.Model): id = models.AutoField(primary_key=True)
name = models.CharField(max_length=22)
addr = models.CharField(max_length=64) class Book(models.Model): id = models.AutoField(primary_key=True)
title = models.CharField(max_length=32)
publisher = models.ForeignKey(to='Publish',to_field='id',on_delete=models.CASCADE)
authors = models.ManyToManyField(to='Author')

一.创建模型

  一对一创建

    obj = models.onetooneField(to='表名', to_Field='字段')

  一对多创建

    obj = models.Foreignkey(to='表名', to='字段名', on_delete=models.CASCADE)

  多对多创建

    obj = models.manytomanyField(to='表名')

二.添加数据

  一对一添加

    models.Author.objects.create(
    name = '太宰治',
    age = 18,
     author_id = 1
    )

  一对多添加

    方式1, 用对象的方式创建

    publish_obj = Publisht.objects.get(id=1)  # 拿到id为1的出版社对象
    book_obj = Book.objects.create(
      title='人间失格',
      publish = publish_obj,
    )

    方式2, 直接指定字段名称创建

    book_obj = Book.objects.create(
      title='人间失格',
      publish_id=1,
    )

  多对多添加

    方式1

    book_obj = models.Book.objects.filter(id=4)[0]
    lzs = models.Author.objects.get(id=1)
    ws = models.Author.objects.get(id=2)     book_obj.authors.add(lzs,ws)

    方式2

    book_obj.authors.add(*[1,2])
    book_obj.authors.add(1,2)

    其他常用API:

     book_obj.authors.remove()      # 将某个特定的对象从被关联对象集合中去除。 book_obj.authors.remove(*[1,2]),将多对多的关系数据删除
     book_obj.authors.clear() #清空被关联对象集合
     book_obj.authors.set() #先清空再设置(更新)

三.删除数据

  一对一、一对多的删改和单表的删改是一样的,因为在models里面我们设置了级联删除

    models.Author.objects.filter(id=1).delete()
    models.Book.objects.filter(id=1).delete()
    book_obj.authors.clear()
    book_obj.authors.remove('')

  多对多删除,用到的

    book_obj.authors.remove() 

三.基于对象的跨表查询

  正向查询与反向查询

    外键字段在哪个表中,它找别人就是正向查询

    别的表找它就是反向查询

  一对一查询(Author表和AuthorDetail): 

    正向查询按字段,反向查询用表名小写

      1 查询名为太宰治的作者的电话号码
      ret = models.Author.objects.get(name='太宰治')
          models.Author.objects.get(name='太宰治').au.address
          models.Author.objects.filter(name='太宰治')[0].au.address
      a = ret.au.tel       2 查询电话号码为111的作者的名称
      ret = models.AuthorDetail.objects.get(tel=111)
      a = ret.author.name

  一对多查询(Publish表与Book表)

    正向查询按字段,反向查询用表名小写_set.all()

    正向查询:

      # 查询主键为1的书籍的出版社所在的城市
      book_obj=Book.objects.filter(pk=1).first()
      # book_obj.publish 是主键为1的书籍对象关联的出版社对象,book对象.外键字段名称
      print(book_obj.publish.city)  

    反向查询: book_set().all()

      publish=Publish.objects.get(name="太阳出版社")
      #publish.book_set.all() : 与苹果出版社关联的所有书籍对象集合,写法:小写的表名_set.all(),得到queryset类型数据
      book_list=publish.book_set.all()
      for book_obj in book_list:
    print(book_obj.title)

  多对多查询:(Author表和Book表)

    正向查询

      # 人间失格所有作者的名字以及手机号

      book_obj=Book.objects.filter(title="人间失格")[0]
      authors=book_obj.authors.all()
      for author_obj in authors:
      print(author_obj.name,author_obj.authorDetail.telephone)

    反向查询

      # 查询太宰治出过的所有书籍的名字

        author_obj=Author.objects.get(name="太宰治")
    book_list=author_obj.book_set.all() #与太宰治作者相关的所有书籍
    for book_obj in book_list:
    print(book_obj.title)

四.基于双下划线的跨表查询

  相当于基于join的联表查询,效率较高,用法是正向按属性(models.py中定义的),反向按表名.

  一对一查询

  #查询太宰治的手机号

  #正向查询
  ret=Author.objects.filter(name="太宰治").values("au__tel")   #反向查询
  ret=AuthorDetail.objects.filter(author__name="太宰治").values("tel")

  一对多查询

  查询太阳出版社出版过的所有书籍的名字与价格(一对多) 

    # 正向查询 按字段:publish

  queryResult=Book.objects.filter(publish__name="太阳出版社").values_list("title","price") #values或者values_list
  #通过__告诉orm将book表和publish表进行join,然后找到所有记录中publish.name='苹果出版社'的记录(注意publish是属性名称),
  然后select book.title,book.price的字段值 # 反向查询 按表名:book queryResult=Publish.objects.filter(name="太阳出版社").values_list("book__title","book__price")

  多对多查询

  #查询太宰治出过的所有书籍的名字(多对多)

  # 正向查询 按字段:authors:
  queryResult=Book.objects.filter(authors__name="太宰治").values_list("title")   # 反向查询 按表名:
bookqueryResult=Author.objects.filter(name="太宰治").values_list("book__title","book__price")

五.修改数据

  修改数据使用update() 用queryset类型来调用

  models.Book.objects.filter(title='太宰治').update(title='村上春树')

  修改多对多对象的关系

 models.Book.objects.filter(title='太宰治')[0].set(*[1,2])

django系列5.3--ORM数据库的多表操作的更多相关文章

  1. Django之模型层第一篇:单表操作

    Django之模型层第一篇:单表操作 一 ORM简介 ​ 我们在使用Django框架开发web应用的过程中,不可避免地会涉及到数据的管理操作(如增.删.改.查),而一旦谈到数据的管理操作,就需要用到数 ...

  2. Django之模型层第二篇:多表操作

    Django之模型层第二篇:多表操作 一 表关系回顾 ​ 在讲解MySQL时,我们提到,把应用程序的所有数据都放在一张表里是极不合理的. ​ 比如我们开发一个员工管理系统,在数据库里只创建一张员工信息 ...

  3. 第69节:Java中数据库的多表操作

    第69节:Java中数据库的多表操作 前言 学习数据库的多表操作,去电商行业做项目吧!!! 达叔,理工男,简书作者&全栈工程师,感性理性兼备的写作者,个人独立开发者,我相信你也可以!阅读他的文 ...

  4. 数据库 MySQL 之 表操作、存储引擎

    数据库 MySQL 之 表操作.存储引擎 浏览目录 创建(复制) 删除 修改 查询 存储引擎介绍 一.创建(复制) 1.语法: 1 2 3 4 5 CREATE TABLE 表名(     字段名1 ...

  5. Day 61 Django第二天 (orm数据库操作)

    一.get请求和post请求 GET请求: 1. 浏览器请求一个页面 2. 搜索引擎检索关键字的时候 POST请求: 1. 浏览器向服务端提交数据,比如登录/注册等 二 . Django中的APP: ...

  6. django系列5.1--ORM对数据库的操作

    Django---ORM数据库操作(图书管理系统基本实例) 一.基本知识 MVC模式(Model–view–controller)是软件工程中的一种软件架构模式,把软件系统分为三个基本部分:模型(Mo ...

  7. django系列5.2--ORM数据库的单表操作

    单表操作 在views.py中添加对数据库的操作语句 #在逻辑代码中导入你要操作的表 from app import models def add_book(request): ''' 添加表记录 : ...

  8. web框架开发-Django模型层(1)之ORM简介和单表操作

    ORM简介 不需要使用pymysql的硬编码方式,在py文件中写sql语句,提供更简便,更上层的接口,数据迁移方便(有转换的引擎,方便迁移到不同的数据库平台)…(很多优点),缺点,因为多了转换环节,效 ...

  9. django连接mysql数据库以及建表操作

    django连接mysql数据库需要在project同名的目录下面的__init__.py里面加入下面的东西 import pymysql pymysql.install_as_MySQLdb() 找 ...

  10. 模型层之ORM、数据库和单表操作

    一.ORM简介 ORM是“对象-关系-映射”的简称,一般指持久化数据和实体对象的映射 1.1 什么是“持久化” 持久(Persistence),即把数据(如内存中的对象)保存到可永久保存的存储设备中( ...

随机推荐

  1. ShaderForge打造自定义光照模型

    [ShaderForge打造自定义光照模型] 1.Lambert逻辑图. 2.Blinn-Phong逻辑图. 参考:https://www.youtube.com/watch?v=EjCXwV0YYd ...

  2. partial function

    [partial function] functools.partial(func[,*args][, **keywords]) Return a new partial object which w ...

  3. java基础一(阅读Head First Java记录)

    写在前面的话 在实际应用java中,因为没有系统去看过书或者学习过,所以基础薄弱,刚好这本书是比较入门级的一些书,记录一下下面的一些基本概念,以方便自己来学习.当然如果对大家有帮助也是很好的. 因为书 ...

  4. Git学习笔记-----下载GitHub上某个分支的代码

    在GitHub上的仓库里,往往建有几个分支,如果只是想下载某个分支的代码,怎么办呢? 1.需要知道远程分支的名称,及远程分支所在的Git仓库 2.按下面指令下载 git clone -b 远程分支名称 ...

  5. 洛谷 P1260 工程规划(差分约束)

    题目描述 造一幢大楼是一项艰巨的工程,它是由n个子任务构成的,给它们分别编号1,2,…,n(5≤n≤1000).由于对一些任务的起始条件有着严格的限制,所以每个任务的起始时间T1,T2,…,Tn并不是 ...

  6. Linux 基础教程 42-xargs命令

        xargs是execute arguments的缩写,主要作用是从标准输入中读取内容,并将此内容传递给它要协助的命令,并作为要协助命令的参数来执行. 基本语法 xargs [选项] [命令] ...

  7. 23 DesignPatterns学习笔记:C++语言实现 --- 2.6 Facade

    23 DesignPatterns学习笔记:C++语言实现 --- 2.6 Facade 2016-07-22 (www.cnblogs.com/icmzn) 模式理解

  8. 解决 sublime text 3 右键菜单栏出现多余的菜单项分隔符的问题

    很早之前装了一个插件 JavaScript Completions,虽然还没有用过它的高级功能,但随着 sublime text 3 逐渐成为我主要的编程工具,最近发现在右键点击文件出现的菜单栏中,菜 ...

  9. centos7 mysql 数据库备份与还原

    数据库备份 show databases; #先查看一下数据库 现在我要备份word数据库 退出mysql输入 mysqldump -u root -p word > word.sql #我把它 ...

  10. Linux文件扩展思考随笔

    Linux文件时间 ============================================================ ls -l 文件名 仅看到的是最后被修改的时间 Linux ...