## 创建多对多
一台主机Host可能部署了好几个应用Application,一个应用Application可能部署在好几台主机Host。因此形成了多次多的关系。因此需要关系表。
### 自定义多对多关系表 HostToApp
~~~
class Host(models.Model):
nid = models.AutoField(primary_key=True)
hostname = models.CharField(max_length=32,db_index=True)
ip = models.GenericIPAddressField(protocol="ipv4",db_index=True)
port = models.IntegerField()
b = models.ForeignKey(to="Business", to_field='id')
class Application(models.Model):
name = models.CharField(max_length=32)
class HostToApp(models.Model):
hobj = models.ForeignKey(to='Host',to_field='nid')
aobj = models.ForeignKey(to='Application',to_field='id')
~~~
### 操作
增删改查都可以通过关系表进行
### 自动创建关系表 ManyToManyField
~~~
class Host(models.Model):
nid = models.AutoField(primary_key=True)
hostname = models.CharField(max_length=32,db_index=True)
ip = models.GenericIPAddressField(protocol="ipv4",db_index=True)
port = models.IntegerField()
b = models.ForeignKey(to="Business", to_field='id')
class Application(models.Model):
name = models.CharField(max_length=32)
r = models.ManyToManyField("Host")
~~~
### 操作
在这里, 无法直接对第三张表进行操作
先获取Application的对象
~~~
obj = Application.objects.get(id=1)
~~~
* 查看所有相关的主机对象“列表” QuerySet
~~~
obj.r.all()
~~~
* 增加
~~~
obj.r.add(2)
obj.r.add(2,3,4)
obj.r.add(*[1,2,3,4])
~~~
* 删除
~~~
obj.r.remove(1)
obj.r.remove(2,4)
obj.r.remove(*[1,2,3])
~~~
* 清空
~~~
obj.r.clear()
~~~
* 更新
~~~
obj.r.set([3,5,7])
~~~