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