假设有表的关系如下:

 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. 水平时间轴 html + css

    比较粗糙,效果如图 这个是写微信页面时写的,pc 也是一样的效果 代码如下: <div class="time_line_box"> <div class=&qu ...

  2. tp5 中 model 的聚合查询

    方法 说明 Count 统计数量,参数是要统计的字段名(可选) Max 获取最大值,参数是要统计的字段名(必须) Min 获取最小值,参数是要统计的字段名(必须) Avg 获取平均值,参数是要统计的字 ...

  3. 问题:QXcbConnection: Could not connect to display

    Wkhtmltopdf 失败 (错误代码: -6). 消息: The switch --header-spacing, is not support using unpatched qt, and w ...

  4. 网络编程之addrinfo

    addrinfo结构体定义如下: typedef struct addrinfo { int ai_flags;//指示在getaddrinfo函数中使用的选项的标志. int ai_family; ...

  5. 多个SVG图形集成到一个SVG图形上

    SVG:使用XML格式定义图像的可缩放矢量图形(Scalable Vector Graphics). 优点就不多说了,下面看看怎么将多个svg图形集成到一个svg图形上. 如果使用bootstrap框 ...

  6. Django【基础篇】

    Python的WEB框架有Django.Tornado.Flask 等多种,Django相较与其他WEB框架其优势为:大而全,框架本身集成了ORM.模型绑定.模板引擎.缓存.Session等诸多功能. ...

  7. 【leetcode】Climbing Stairs

    题目简述: You are climbing a stair case. It takes n steps to reach to the top. Each time you can either ...

  8. 使用FP-Growth算法高效发现频繁项集【zz】

    FP树构造 FP Growth算法利用了巧妙的数据结构,大大降低了Aproir挖掘算法的代价,他不需要不断得生成候选项目队列和不断得扫描整个数据库进行比对.为了达到这样的效果,它采用了一种简洁的数据结 ...

  9. VirtualBox使用总结

    解决VirtualBox安装Mac OS X El Capitan开机卡住问题 在配置完新虚拟机后关闭VirtualBox,用管理员权限启动CMD,转到VirtualBox安装目录,依次运行下列指令: ...

  10. HTML常用属性

    blue:蓝色  red:红色  yellow:黄色  green:绿色  white:白色 gray:灰色 /*去掉下划线*/ text-decoration: none; /*添加下划线*/ te ...