假设有表的关系如下:

 class Classes(models.Model):
name = models.CharField(max_length=32)
institute = models.CharField(max_length=32)
headteacher = models.ForeignKey("Teacher")
def __str__(self):
return self.name
class Teacher(models.Model):
name = models.CharField(max_length=32)
student_belong = models.ManyToManyField("Students")
def __str__(self):
return self.name
class Students(models.Model):
name = models.CharField(max_length=32)
class_belong = models.ForeignKey("Classes")
def __str__(self):
return self.name

  简单来说,就是老师和班级是一对多,和学生是多对多。

一对多

class_all = Classes.objects.all() class_one = Classes.objects.get(id=1)

  得到了两个对象,假设班级中有headteacher这样的查询为正向的查询。

  那么正向:

tea = class_one.headteacher.name

all_class = class_all.values_list("id","name","headteacher__name")

  tea是通过点的方式直接找到了相关联的老师信息。通过values这种方式则是要用双下划綫__。一般直接使用values结果是字典形式。

  反向:指的是teacher是被关联方里面没有class字段。

teacher_one = Teacher.objects.get(id=1)

teacher_all = Teacher.objects.all()

all_class = teacher_all.values("name","classes__name")   这里class必须是小写。

class_name = teacher_one.classes_set

  反向的values里面在写错的时候会报错并提示有几个可选。得知有classes选项。虽然在models的Teacher类中没有这个字段。

  在使用点的时候也有所不同多出了下划线_set的用法。

多对多  

有django自动生成多对多表的操作 (也可以自己写)
author_list = models.Author.objects.values("id","name","m__name") # values 中直接写关系 双下划綫是表示m的name
print(author_list)
obj = models.Author.objects.get(id=1)
增加
obj.m.add(3)
obj.m.add(3,4)
obj.m.add(*[2,3])
删除
obj.m.remove(3)
obj.m.remove(3,4)
obj.m.remove(*[2,3])
修改
obj.m.set([1,2,3]) # 有则覆盖 无则增加
obj.m.clear()

反向
obj = models.Book.objects.get(id=2)

obj_author = obj.author_set # 拿到作者列表增删改查一样

自己写的多对多关系表

 class T_S(models.Model):
teacher_id = models.ForeignKey(Teacher)
student_id = models.ForeignKey(Student)
class Meta():
unique_together = (
('teacher_id','student_id'),
     )

  其中meta是将这两个变成联合唯一。防止重复出现。

  自己写第三张关系表的优点在于所有的一对多的操作都可以用在多对多的表中。利于查询等操作。

django--一对多,多对多查询的更多相关文章

  1. 数据库开发-Django ORM的多对多查询

    数据库开发-Django ORM的多对多查询 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.联合主键问题 CREATE TABLE `employees` ( `emp_no` ...

  2. Django一对多,多对多操作

    简要说明 Django里面的数据库操作O2O&M2M,一般归属于models管理 使用场景 一对一:在某表中创建一行数据时,有一个单选的下拉框(下拉框中的内容被用过一次就消失了).//两个表的 ...

  3. Mybatis一对多/多对多查询时只查出了一条数据

    问题描述: 如果三表(包括了关系表)级联查询,主表和明细表的主键都是id的话,明细表的多条数据只能查询出来第一条/最后一条数据. 三个表,权限表(Permission),权限组表(Permission ...

  4. django(3) 一对多跨表查询、ajax、多对多

    1.一对多跨表查询获取数据的三种形式:对象.字典.元组 例:有host与business两张表,host与business的id字段关联,business在host表中的对象名是b,  通过查询hos ...

  5. Django ORM 一对一,一对多,多对多, 添加,批量插入和查询

    模型类 class Book(models.Model): nid = models.AutoField(primary_key=True) title = models.CharField(max_ ...

  6. Django框架第七篇(模型层)--多表操作:一对多/多对多增删改,跨表查询(基于对象、基于双下划线跨表查询),聚合查询,分组查询,F查询与Q查询

    一.多表操作 一对多字段的增删改(book表和publish表是一对多关系,publish_id字段) 增  create publish_id 传数字   (publish_id是数据库显示的字段名 ...

  7. Django 一对多,多对多关系解析

    [转]Django 一对多,多对多关系解析   Django 的 ORM 有多种关系:一对一,多对一,多对多. 各自定义的方式为 :        一对一: OneToOneField         ...

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

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

  9. Django:表多对多查询、聚合分组、FQ查询、事务

    1表多对多的关系查询 准备工作创建表结构 from django.db import models # Create your models here. class Publisher(models. ...

  10. mybatis(一、原理,一对多,多对一查询)

    MyBatis框架及原理分析 MyBatis 是支持定制化 SQL.存储过程以及高级映射的优秀的持久层框架,其主要就完成2件事情: 封装JDBC操作 利用反射打通Java类与SQL语句之间的相互转换 ...

随机推荐

  1. hyperV中修改centos分辨率

    grubby --update-kernel=ALL --args="video=hyperv_fb:1366x768"

  2. SpringMVC基本配置

    1 springmvc 框架 1.1  回顾mvc结构 1.2springmvc的介绍 是一个基于mvc的web层框架,使用spring的一个子项目 在使用springmvc的时候,不用单独和spri ...

  3. Python常见问题及资料收集

    1,字符编码处理: http://bbs.chinaunix.net/thread-1431029-1-1.html

  4. intellij idea 插件 ideaVim 用法

    intellij idea 插件 ideaVim - Genji_ - 博客园http://www.cnblogs.com/nova-/p/3535636.html IdeaVim插件使用技巧 - - ...

  5. TreeView checkbox 全选

    在使用TreeView 控件 ,进行权限管理的时候,需要使用 checkbox全选. 勾选父节点,子节点全部选中.取消父节点,子节点不选中. 勾选子节点,父节点也选中. 以下是在使用的例子: < ...

  6. RocketMQ与kafka对比(18项差异)-转自阿里中间件

    淘宝内部的交易系统使用了淘宝自主研发的Notify消息中间件,使用Mysql作为消息存储媒介,可完全水平扩容,为了进一步降低成本,我们认为存储部分可以进一步优化,2011年初,Linkin开源了Kaf ...

  7. XD, XR, DR 股票

    股权登记日与除权除息日 所以,如果投资者想得到一家上市公司的分红.配股权,就必须弄清这家公司的股权登记日在哪一天,否则就会失去分红.配股的机会. 股权登记日后的第一天就是除权日或除息日,这一天或以后购 ...

  8. Python for Infomatics 第13章 网页服务一(译)

    注:文章原文为Dr. Charles Severance 的 <Python for Informatics>.文中代码用3.4版改写,并在本机测试通过. 一旦利用程序通过HTTP协议获得 ...

  9. 如何將ViewData裡包含的Html輸出(MVC)

    如何將ViewData裡包含的Html輸出(MVC) 默認輸入ViewData裡的Htm系統會自動把標籤轉換而達不到預覽的效果, 我們如果要呈現解析後的HTML則要調用@MvcHtmlString.C ...

  10. css选择器总结

    (一)选择器优先级: 不同级别 1. 在属性后面使用 !important 会覆盖页面内任何位置定义的元素样式. 2.作为style属性写在元素内的样式 3.id选择器 4.类选择器 5.标签选择器 ...