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 ...
随机推荐
- botbrew下写glib2程序
作者 He YiJun – storysnail<at>gmail.com 团队 ls 版权 转载请保留本声明! 本文档包含的原创代码根据General Public License,v3 ...
- Angular 2 + Electron 开发web和桌面应用
https://github.com/zhongzf/angular2-electron-quickstart Web用法: # Clone this repository git clone htt ...
- dp跟px的互相转换
一 获取手机屏幕的密度 1 获取屏幕的宽和高,然后根据 直角三角形的 a边的平方+b边的平方=c边的平方 得到另一条边的长:然后除以 ,屏幕的尺寸,就是 手机的密度destity 2 根据上下文获取c ...
- 使用IronPython给.Net程序加点料
开发的时候,经常被策划频繁变动的方案而苦恼.这时候就想要加入点动态语言来辅助一下. 在考虑用动态语言之前也曾想过使用动态加载dll的方式,实现基础接口来调用.在卸载的时候遇到了问题,虽可以通过应用程序 ...
- EntityFunctions.AsNonUnicode
http://blog.csdn.net/zzx3q/article/details/7863797 使用工具VS2010 凡是调用FindAll的地方,如果传入参数是String类型的变量(数字类型 ...
- hadoop 学习笔记:mapreduce框架详解
开始聊mapreduce,mapreduce是hadoop的计算框架,我学hadoop是从hive开始入手,再到hdfs,当我学习hdfs时候,就感觉到hdfs和mapreduce关系的紧密.这个可能 ...
- Python2.6下基于rsa的加密解密
生成公钥的私钥: # -*- coding: UTF-8 -*- import rsa import base64 (public_key, private_key) = rsa.newkeys(10 ...
- 身份证号码查询与生成(C#源码)
项目要用到这个功能,就写了一个,完整类也就二百来行,很简单.可以在项目中用,也可以作为学习. 源码下载 http://yunpan.cn/cmQCSWkhDnZLJ 访问密码 0227 核心代码如下 ...
- 数据库的Timeout
数据库的Timeout 其实有很多种情况. 一个是执行的超时时间 executionTimeOut,一个是连接的超时时间connectionTimeOut, 还有呢? 等待的超时时间 ReadTime ...
- java代码效率优化
[转载于http://blog.163.com/user_zhaopeng/blog/static/16602270820122105731329/] 1. 尽量指定类的final修饰符 带有fina ...