Django--models多对多
多对多--ManyToMany
应用场景
在某表中创建一行数据时,有一个可以多选的下拉框(一对一是单选框)
例如:创建用户信息,需要为用户指定多个爱好
创建表
两种方法,一个是利用Django自动为多对多创建关联的第三张表,另一种是自己手动创建关系表。
NO.1
根据Django中的代码,自动为多对多表创建一个第三张表对应关系
1
2
3
4
5
6
7
8
|
class Host(models.Model): hostname = models.CharField(max_length = 32 ) port = models.IntegerField() class HostAdmin(models.Model): username = models.CharField(max_length = 32 ) email = models.CharField(max_length = 32 ) host = models.ManyToManyField(Host) |
NO.2
自定义多对多表,没有ORM都是自己生成
models.py
1
2
3
4
5
6
7
8
9
10
11
12
|
class Host1(models.Model): hostname = models.CharField(max_length = 32 ) port = models.IntegerField() class HostAdmin1(models.Model): username = models.CharField(max_length = 32 ) email = models.CharField(max_length = 32 ) host = models.ManyToManyField(Host1, through = 'HostRelation' ) class HostRelation(models.Model): c1 = models.ForeignKey(Host1) c2 = models.ForeignKey(HostAdmin1) |
view.py
1
2
3
4
5
6
7
8
9
|
#多对多自定义创建表 models.HostRelation.objects.create( c1 = models.Host1.objects.get( id = 1 ), c2 = models.HostAdmin1.objects.get( id = 2 ) ) models.HostRelation.objects.create( c1_id = 2 , c2_id = 1 ) |
创建数据
1
2
3
4
5
6
7
|
初始化数据 models.Host.objects.create(hostname = 'c1' ,port = 80 ) models.Host.objects.create(hostname = 'c2' ,port = 80 ) models.Host.objects.create(hostname = 'c3' ,port = 80 ) models.HostAdmin.objects.create(username = 'root' ,email = '1@live.com' ) models.HostAdmin.objects.create(username = 'dali' ,email = 'dali@live.com' ) models.HostAdmin.objects.create(username = 'haojie' ,email = 'haojie@live.com' ) |
添加数据
1
2
3
4
5
6
7
8
9
10
11
12
|
#正向添加 #目的,给大力分配两个主机的管理权限 #1、获取大力用户 admin_obj = models.HostAdmin.objects.get(username = 'dali' ) #2、获取指定的两个主机 host_list = models.Host.objects. filter (id__lt = 3 ) #3、将两个主机和大力添加到第三张对应表中 admin_obj.host.add( * host_list) #反向添加 host_obj = models.Host.objects.get( id = 3 ) admin_list = models.HostAdmin.objects. filter (id__gt = 1 ) host_obj.hostadmin_set.add( * admin_list) |
查询数据
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
#查询数据 #第一种方式 #正向查 admin_obj = models.HostAdmin.objects. all ( id = 1 ) for item in admin_obj: item.host. all () #反向查 host_obj = models.Host.objects.get( id = 1 ) host_obj.hostadmin_set. all () #第二种方式 relation_list = models.HostRelation.objects. all () relation_list = models.HostRelation.objects. filter (c2__username = 'dali' ) for item in relation_list: print item.c1.hostname print item.c2.username |
Django--models多对多的更多相关文章
- day20 Django Models 操作,多表,多对多
1 Django models 获取数据的三种方式: 实践: viwes def business(request): v1 = models.Business.objects.all() v2 = ...
- django models 类型整理 version:1.8.3
django models 类型整理 version:1.8.3 网上百度到的最上面的一篇已经是11年的了,django变化很大,现在把1.8.3版的models类型大致整理了下贴出来 普通键部分 F ...
- django models 数据库操作
django models 数据库操作 创建模型 实例代码如下 from django.db import models class School(models.Model): pass class ...
- Django中多对多关系的orm表设计
作者的管理 1.设计表结构 出版社 书籍 作者 一个出版社出版多个书籍 1对多 书籍和作者的关系:一个作者写多本书,一本书可以是多个作者写.多对多 1)创建一张表,表中多对多的数据关系.使用 多对多 ...
- Python - Django - ORM 多对多表结构的三种方式
多对多的三种方式: ORM 自动创建第三张表 自己创建第三张表, 利用外键分别关联作者和书,关联查询比较麻烦,因为没办法使用 ORM 提供的便利方法 自己创建第三张表,使用 ORM 的 ManyToM ...
- django models中的class meta
Django models中的meta选项 通过一个内嵌类 "class Meta" 给你的 model 定义元数据, 类似下面这样: class Foo(models.Model ...
- Django models 操作高级补充
Django models 操作高级补充 字段参数补充: 外键 约束取消 ..... ORM中原生SQL写法: raw connection extra
- Django models Form model_form 关系及区别
Django models Form model_form
- Django models .all .values .values_list 几种数据查询结果的对比
Django models .all .values .values_list 几种数据查询结果的对比
- django models数据类型
Django Models的数据类型 AutoField IntegerField BooleanField true/false CharField maxlength,必填 TextField C ...
随机推荐
- vc编译 zlib 1.2.8
最近用到gzip关的算法,于是想起了zlib这个库,于是将其下载下来编译. 首先,在官网上下载源码包:http://zlib.net/zlib-1.2.8.tar.gz 解压之后,打开vc 命令工具: ...
- Hadoop日记Day18---MapReduce排序分组
本节所用到的数据下载地址为:http://pan.baidu.com/s/1bnfELmZ MapReduce的排序分组任务与要求 我们知道排序分组是MapReduce中Mapper端的第四步,其中分 ...
- C# WPF获取任务栏时间区域的Rectangle
[StructLayout(LayoutKind.Sequential)] public struct WindowRect { public int left; public int top; pu ...
- 一道原生js题目引发的思考(鼠标停留区块计时)
我瞎逛个啥论坛,发现了一个题目,于是本着练手的心态就开始写起来了,于是各种问题接踵而至,收获不小. 题目是这样的: Demo: mouseenter与mouseover区别demo 跨浏览器的区块计数 ...
- iOS——Core Animation 知识摘抄(一)
本文是对http://www.cocoachina.com/ios/20150104/10814.html文章的关键段落的摘抄,有需要的看原文 CALayer和UIView的关系: CALayer类在 ...
- Android 综合揭秘 —— 全面剖释 Service 服务
引言 Service 服务是 Android 系统最常用的四大部件之一,Android 支持 Service 服务的原因主要目的有两个,一是简化后台任务的实现,二是实现在同一台设备当中跨进程的远程信息 ...
- Linux C/C++的编译
以前在Linux上面编译过C,但是没有编译过C++,今天用到了,就稍微学习了一下. 简单的介绍 linux 中最重要的编译工具是 GCC.GCC 是 GNU 的 C 和 C++ 编译器.实际上,GCC ...
- git 仓库、分支的区别
首先,要明白仓库的概念 仓库可以理解为repository, 就是存放代码的地方,—— 其实是一个比较笼统的概念,不管里面的内容,总之存放各种资源(代码.图片等等) 对于git应用开发者而已,本地一般 ...
- splice slice
array的方法中,有这么两个方法, 很久之前接触flex的时候就知道了. 可是总是记不太清. splice() 方法向/从数组中添加/删除项目,然后返回被删除的项目 slice() 方法可从已有的数 ...
- Atitit java 二维码识别 图片识别
Atitit java 二维码识别 图片识别 1.1. 解码11.2. 首先,我们先说一下二维码一共有40个尺寸.官方叫版本Version.11.3. 二维码的样例:21.4. 定位图案21.5. 数 ...