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






















免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM