django--一对多,多对多查询
假设有表的关系如下:
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--一对多,多对多查询的更多相关文章
- 数据库开发-Django ORM的多对多查询
数据库开发-Django ORM的多对多查询 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.联合主键问题 CREATE TABLE `employees` ( `emp_no` ...
- Django一对多,多对多操作
简要说明 Django里面的数据库操作O2O&M2M,一般归属于models管理 使用场景 一对一:在某表中创建一行数据时,有一个单选的下拉框(下拉框中的内容被用过一次就消失了).//两个表的 ...
- Mybatis一对多/多对多查询时只查出了一条数据
问题描述: 如果三表(包括了关系表)级联查询,主表和明细表的主键都是id的话,明细表的多条数据只能查询出来第一条/最后一条数据. 三个表,权限表(Permission),权限组表(Permission ...
- django(3) 一对多跨表查询、ajax、多对多
1.一对多跨表查询获取数据的三种形式:对象.字典.元组 例:有host与business两张表,host与business的id字段关联,business在host表中的对象名是b, 通过查询hos ...
- Django ORM 一对一,一对多,多对多, 添加,批量插入和查询
模型类 class Book(models.Model): nid = models.AutoField(primary_key=True) title = models.CharField(max_ ...
- Django框架第七篇(模型层)--多表操作:一对多/多对多增删改,跨表查询(基于对象、基于双下划线跨表查询),聚合查询,分组查询,F查询与Q查询
一.多表操作 一对多字段的增删改(book表和publish表是一对多关系,publish_id字段) 增 create publish_id 传数字 (publish_id是数据库显示的字段名 ...
- Django 一对多,多对多关系解析
[转]Django 一对多,多对多关系解析 Django 的 ORM 有多种关系:一对一,多对一,多对多. 各自定义的方式为 : 一对一: OneToOneField ...
- day 69-70 一对一 一对多 多对一联表查询
day 69 orm操作之表关系,多对多,多对一 多对一/一对多, 多对多{类中的定义方法} day69 1. 昨日内容回顾 1. 单表增删改查 2. 单表查询API 返回QuerySet对象的: 1 ...
- Django:表多对多查询、聚合分组、FQ查询、事务
1表多对多的关系查询 准备工作创建表结构 from django.db import models # Create your models here. class Publisher(models. ...
- mybatis(一、原理,一对多,多对一查询)
MyBatis框架及原理分析 MyBatis 是支持定制化 SQL.存储过程以及高级映射的优秀的持久层框架,其主要就完成2件事情: 封装JDBC操作 利用反射打通Java类与SQL语句之间的相互转换 ...
随机推荐
- 同步异步,阻塞非阻塞 和nginx的IO模型
同步与异步 同步和异步关注的是消息通信机制 (synchronous communication/ asynchronous communication).所谓同步,就是在发出一个*调用*时,在没有得 ...
- HTML行为元素和块级元素及语义化
块级元素 div - dl - form 交互表单h1 - h6 标题 hr 水平分割线p 段落ul 非排序列表table 表格 行内元素 a 链接br 换行em 强调i 斜体img 图片input ...
- win7安装Linux
1. 新建分区必须为FAT32 (不是绿色的可用分区,只要linux安装时可以识别) 大小大于8G 2.打开ISO, 把casper文件夹下的initrd.lz vmlinuz 两个文件提取到C盘下 ...
- Oracle 11g新特性延迟段创建和truncate的增强
下面测试Oracle 11g开始的新特性truncate的增强和延迟段空间创建. Oracle从11g开始,当用户创建一张空表的时候不会先分配段和空间,只有当对这张表插入第一行数据的时候才分配段和空间 ...
- java基础(四)
一.面向对象的三个基本特征: 1.封装,将对象的实现细节隐藏起来,并通过公共接口暴露相关功能: 2.继承,代码复用的表现,当子类继承父类后,子类作为一种特殊的父类,直接获得父类的属性和方法: 3.多态 ...
- JavaOO面向对象中的注意点(二)
1.封装: 封装主要体现在:组装类 和 信息隐藏. a.信息隐藏:①访问修饰符:private ②方法的实现:get/set方法.run()方法-控制流程 b.组装类: ①类的定义:属性.构造.行为( ...
- 各种解析漏洞获取Webshell
各种解析漏洞拿shell 一.IIS 6.0解析漏洞 IIS 6.0解析利用方法有两种1.目录解析/xx.asp/xx.jpg2.文件解析wooyun.asp;.jpg第一种,在网站下建立文件夹的名 ...
- input的实时监控
<input id="phone" type="tel" placeholder="请输入手机号"> $("#phon ...
- C#(委托a)
C#(委托a) public delegate double TheOperator(double x, double y); public class Operators { static publ ...
- 摸索探寻之Mac OS 使用及快捷键
刚发现的一个介绍Mac OS入门的帖子,新入手Mac的同学可以看看http://www.cnblogs.com/chijianqiang/archive/2011/08/03/2126593.html ...