## 創建多對多
一臺主機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])
~~~