多对多--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

最新文章

  1. C#如何获取项目中的其他文件夹的路径
  2. PAT 1016. 部分A+B (15)
  3. 杨辉三角用java实现
  4. linux开机启动
  5. 为 Virtual Box 中的 CentOS 6.6 配置本地DVD光盘做yum软件源
  6. ARTICLES
  7. Linux 虚拟机和物理机配互信出现无法连接
  8. 解读BOM与COM
  9. Android项目Tab类型主界面大总结 Fragment+TabPageIndicator+ViewPager
  10. AI 人工智能 探索 (八)
  11. 《iOS Human Interface Guidelines》——Multitasking
  12. ROS探索总结(十九)——如何配置机器人的导航功能
  13. Linux网络设置(第二版) --Linux网络设置
  14. (后端)Mybatis中#{}和${}传参的区别及#和$的区别小结(转)
  15. Linux 忘记登录密码?破解系统登陆密码
  16. python爬虫随笔(2)—启动爬虫与xpath
  17. JS实现下拉单的二级联动
  18. Intellij IDEA 使用GitHub+Git
  19. 【Jenkins】安装插件
  20. e856. 列出一个组件的所有事件

热门文章

  1. 如何安全地关闭MySQL实例
  2. 使用curl 下载HTML
  3. [ZigBee] 12、ZigBee之看门狗定时器——饿了就咬人的GOOD DOG
  4. iOS——Core Animation 知识摘抄(三)
  5. 在Grunt task中集成Protractor
  6. 如何成为一个Xamarin专家
  7. 移动APP的自动化测试
  8. 浮动ip
  9. ios NSFileManager和NSFileHandle(附:获取文件大小 )
  10. Jenkins的系统设置