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 ...
随机推荐
- Courier-MTA 0.72 发布,电子邮件系统
Courier-MTA 0.72 增加了 ratefilter,用来限制速率的邮件过滤器. Courier 是一个优秀的电子信件系统,功能上它远比 Qmail. Postfix 等我们已经熟知的系统完 ...
- 公共代码参考(httpclient)
public class HttpClientUtils { private static final String CHARSET = "UTF-8"; /* * http ge ...
- 【WEB】Tomcat基础使用知识
由于当前项目性质原因,从开始到现在使用的WEB服务器都是WAS,而Tomcat的基础知识也慢慢地被遗忘.由于种种原因,让我参与到了另外一个全新的项目,使用的是Tomcat6.X,所以复习是必须的,而写 ...
- 实战-Fluxion与wifi热点伪造、钓鱼、中间人攻击、wifi破解
原作者:PG 整理:玄魂工作室-荣杰 目录: 0x00-Fluxion是什么 0x01-Fluxion工作原理 0x02-Kali上安装fluxion 0x03-Fluxion工具使用说明+实 ...
- java实现输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。
package JingDian; import java.util.Scanner; public class charKind { public static void main(String[] ...
- statcounter统计的浏览器市场占有率
Source: StatCounter Global Stats - Browser Market Share
- Java处理Radius access-challenge
最近使用 RSA Authentication Manager, 并且与其自带的Radius server整合, RSA的Radius server 配置不太透明, 目前只配成功了PAP方式的验证,C ...
- .NetCore~Linux环境下部署
NetCore正式版已经出现有段时候了,Windows下使用vs2015开发.netCore应用程序,然后通过dotnet程序开启WEB服务,用着很像node.js,当然我们不会于只局限于window ...
- iOS开发——UI精选OC篇&UIApplication,UIWindow,UIViewController,UIView(layer)简单介绍
UIApplication,UIWindow,UIViewController,UIView(layer)简单介绍 一:UIApplication:单例(关于单例后面的文章中会详细介绍,你现在只要知道 ...
- bootstrap实现嵌入的button
bootstrap实现嵌入的button 如下的效果: <div class="form-inline"> <div class="input-grou ...