在之前的博客中已经讲述了使用ORM的多对多关系表,现在进行总结一下:

1.ORM自动帮助我们创建第三张表

2.手动创建第三张表,第三张表使用ForeignKey指向其他的两张表关联起来

3.手动创建第三张表,使用的和ORM帮助我们创建的一样(这种方法暂时先不赘述)

该博客重点讲一下第二种方法:手动创建第三张表,并且第三张表使用ForeignKey指向其他两张表关联起来

以作者和出版的书进行举例子。作者可以写多本书,书也可以有多个作者,书与作者的关系就是多对多的关系

1.创建两张各自的表(作者表和书籍表)

class UserTest(models.Model):
"""
作者表
字段:id,作者名字
"""
id=models.AutoField(primary_key=True)
name=models.CharField(max_length=20) class BookTest(models.Model):
"""
书籍表
字段:id,书籍名称
"""
id=models.AutoField(primary_key=True)
name=models.CharField(max_length=20)

目前这两张表属于没有任何关系的,接下来就要创建第三张表,使用第三张表让这两张表关联起来,本质就是使用第三张表记录作者表id和书籍表id分别当作外键

class UserAndBook(models.Model):
"""
第三张表
字段:user字段是记录作者表的id,book字段是记录书籍表的id
"""
id=models.AutoField(primary_key=True)
user=models.ForeignKey(to="UserTest")
book=models.ForeignKey(to="BookTest")

查询id=1的作者出版的书有多少本

(1)首先查询第三张表中user=1的所有信息,也就是id=1的作者。

get_all_book_id=models.UserAndBook.objects.filter(user=1).values_list("book")

这句表示获取UserAndBook表中所有user=1的信息,然后只需要查询book字段的数据,通过列表返回,在返回的列表对象中,每个元素都是一个元组。

(2)此时拿到了id=1的作者名下的所有书籍id,由于(1)中取出来的get_all_book变量是一个列表,并且每个元素是一个元组,所以就需要讲每个书籍id都取出来,使用lambda表达式或者其他都可以

ret=[i[0] for i in get_all_book_id]

(3)拿到书籍的id查询书籍表

show_all_books=models.BookTest.objects.filter(id__in=ret)

此时就获取到了id=1作者下的所有书籍实例。

======================================================================

第三种方法暂时不更新,等以后有时间再来补

pass

======================================================================

可能有同学问了,使用自动创建表不好吗,为什么手动创建,这里我解释一下,首先大家可以发现,自动创建的第三张表里面只记录了其他两张表对应的id,没有其他的字段了,但如果因为业务需要,需要在第三张表中添加几个字段,那么自动创建表就不是太符合我们的需求了,所以手动创建表就产生了作用了。

Django框架之ORM的相关操作之多对多三种方式(五)的更多相关文章

  1. Django框架之ORM的相关操作(一)

    一.一般操作 from django.db import models import datetime # Create your models here. class Author(models.M ...

  2. Django框架之ORM的相关操作之分页(六)

    分页是每个项目必不可少要写的一个功能,该篇文章就将记录一下使用ORM写分页的过程. 假设我们的数据库里面需要显示一些数据,而这个表中的数据大约有几千条数据,那么我们不可能将所有的数据都显示出来,那么就 ...

  3. Django框架之ORM的相关操作之一对一关系(四)

    ORM中一对一在当一张表的某一些字段查询的比较频繁,另外一些字段查询的不是特别频繁,那么就把不常用的字段单独拿出来做成一张表,然后通过一对一进行关联起来.举个例子:在我们登录某个账户的时候,一般会显示 ...

  4. Django框架之ORM的相关操作(二)

    模型类: class Commongity(models.Model): id=models.AutoField(primary_key=True) name=models.CharField(max ...

  5. Django框架06 /orm多表操作

    Django框架06 /orm多表操作 目录 Django框架06 /orm多表操作 1. admin相关操作 2. 创建模型 3. 增加 4. 删除 5. 修改 6. 基于对象的跨表查询 7. 基于 ...

  6. Django框架05 /orm单表操作

    Django框架05 /orm单表操作 目录 Django框架05 /orm单表操作 1. orm使用流程 2. orm字段 3. orm参数 4. orm单表简单增/删/改 5. orm单表查询 5 ...

  7. django框架基础-ORM跨表操作-长期维护

    ###############    一对一跨表查询    ################ import os if __name__ == '__main__': os.environ.setde ...

  8. Django框架之ORM对表结构操作

    ORM的优点:(1)简单,不用自己写SQL语句 (2)开发效率高 ORM的缺点:对于不同的人写的代码,执行效率有差别 ORM的对应关系: 类  ---------->  数据表 对象------ ...

  9. django框架基础-ORM单表操作-长期维护

    ###############    单表操作-添加数据    ################ import os if __name__ == '__main__': os.environ.set ...

随机推荐

  1. windows redis启动

    1.下载redis 2.启动redis 3.启动redis客户端并设置protected-mode为false

  2. Unable to load authentication plugin 'caching_sha2_password'

    Caused by: com.mysql.cj.core.exceptions.WrongArgumentException: Unable to load authentication plugin ...

  3. python:删除文件及文件夹

    #!/usr/bin/python# -*- coding:utf-8 -*- import os import shutil os.remove(path) #删除文件shutil.rmtree(p ...

  4. SGD 讲解,梯度下降的做法,随机性。理解反向传播

    SGD 讲解,梯度下降的做法,随机性.理解反向传播 待办 Stochastic Gradient Descent 随机梯度下降没有用Random这个词,因为它不是完全的随机,而是服从一定的分布的,只是 ...

  5. SQLAlchemy,flask-sqlalchemy

    SQLAlchemy 1.介绍 SQLAlchemy是一个基于Python实现的ORM框架.该框架建立在 DB API之上,使用关系对象映射进行数据库操作,简言之便是:将类和对象转换成SQL,然后使用 ...

  6. day22 用户添加相关命令 特殊权限为 防止root修改文件

    2) 用户相关的命令 useradd -u -g -G -M -s -c usermod -u -g -G -s -c userdel -r groupadd groupmod groupdel ch ...

  7. wcf编程资料

    如下为WCF编辑资料 链接:https://pan.baidu.com/s/1kZnc6eNOfEggHSfJNXj8Ag 提取码:gj7s 复制这段内容后打开百度网盘手机App,操作更方便哦 第01 ...

  8. LOJ 劳孙肉饼

    题目链接 XRRRRQAQ 去学文化的的样子太萌啦!!! XRRRRQAQ 在课上太无聊,以至于吃起了劳孙(你不用知道这是什么) 显然劳孙是一个 N * M 的肉饼(即N行 M 列) XRRRRQAQ ...

  9. Vue的iview组件框架select远程搜索,选中后不刷新的问题

    1.场景:弹框内有一个下拉组件(支持搜索),当选择完数据后弹框关闭,再次打开后,下拉框内的数据是刚才选中的数据.原因:分析后觉得是搜索内容没有清空,导致下拉的数据只有一个 2.解决方案 a .解决:调 ...

  10. 给html元素添加自定义属性,并且用jquery进行筛选

    例如有多个div,想要实现类似radio的效果. <div name="teacher" selected="selected">tch1</ ...