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语句之间的相互转换 ...
随机推荐
- SQL Server 临时禁用和启用所有外键约束(高版本向低版本迁移数据)
--获得禁用所有外键约束的语句 select 'ALTER TABLE [' + b.name + '] NOCHECK CONSTRAINT ' + a.name +';' as 禁用约束 from ...
- 使用vs2008搭建php扩展环境
所需要的工具或者文件: 1.php源码,去官网下载即可.http://windows.php.net/download 2.php-sdk:php 开发工具包 3.deps类库 4.Cygwin:wi ...
- Oracle资源管理器(二)-- 创建和使用数据库资源计划
(参考 http://blog.csdn.net/mrluoe/article/details/7969436 -- 整理并实践通过) 第1步,创建3个用户 SQL> create user s ...
- Zookeeper分布式集群搭建
实验条件:3台安装linux的机子,配置好Java环境. 步骤1:下载并分别解包到每台机子的/home/iHge2k目录下,附上下载地址:http://mirrors.cnnic.cn/apache/ ...
- 判断横屏竖屏,然后CSS重新计算
function hengshuping(){ if(window.orientation==180||window.orientation==0){ alert("竖屏状态!") ...
- 【淘淘】Quartz之集群利弊
一.前言: 虽然单个Quartz实例能给予我们很好的任务job调度能力,但它不能满足典型的企业需求,如可伸缩性.高可靠性满足.假如你需要故障转移的能力并能运行日益增多的 Job,Quartz集群势必成 ...
- 疑问:line-height对非文字行内块的影响
line-height:对子元素是非文字的行内块,表现出来的不是垂直居中.目前还不知道具体细节. 可以看出来两个东西不在一行.老师的解释是line-height对非文字元素解释不一样,但是我没懂细节. ...
- htaccess分布式配置文件常用写法
htaccess 写法 Apache中的.htaccess(或者”分布式配置”了针对目录改变配置的方法,即,在特定的文档目录中放置包含或多个指令的,以作用于此目录及其子目录.作为,所能的命令受到限制. ...
- PHP require和include的区别
require一个文件存在错误的话,那么程序就会中断执行了,并显示致命错误 include一个文件存在错误的话,那么程序不会中端,而是继续执行,并显示一个警告错误. 以下为补充:1. include有 ...
- CodeForces 548
A. Mike and Fax time limit per test 1 second memory limit per test 256 megabytes input standard inpu ...