Foreignkey :
models表
class Host(models.Model): hostname = models.CharField(max_length=64) host_group = models.ForeignKey('Group') class Group(models.Model): name = models.CharField(max_length=64) remark = models.CharField(max_length=1024, null=True,blank=True) def __unicode__(self): return self.name
表结构 会在host表中添加一个group_id的字段,所有创建和查询的时候就当做一个和hostname一样对待的key就行了
may to many Field 就复杂点了
models表:
class Host(models.Model): hostname = models.CharField(max_length=64) host_group = models.ManyToManyField('Group') class Group(models.Model): name = models.CharField(max_length=64) remark = models.CharField(max_length=1024, null=True,blank=True) def __unicode__(self): return self.name
它的表结构就会生成一个第三个表,着个表就是对应host和group的表,所以操作也不太一样
在做之前我们看一下表结构
host table
group table
还多出一个asset_host_host_group table
asset_host_host_group 就是我们在定义ManyToManyField 的对应表,该字段不会在
首先获取两个对象,一个是主机对象,一个是组对象
>>> node_10 = models.Host.objects.create(hostname='node-10-test') >>> manager_group = models.Group.objects.get(name='Manager')
为host添加一个组
>>> node_10.host_group.add(manager_group)
>>> node_10.save()
这时候mysql表更新了数据
这就是实现了many-to-many,
那我们看看查询怎么查啊,
>>> node_10.host_group.all() [<Group: Manager>] >>> node_10.host_group.values_list() [(3L, u'Manager', u'Openstack Manager Group')]
查询所有的主机中,属于manager组的主机列表:
>>> m1 = models.Group.objects.get(name='Manager') >>> b = models.Host.objects.filter(host_group=m1) >>> b [<Host: node-3.domain.tld>, <Host: node-6.domain.tld>, <Host: node-5.domain.tld>, <Host: node-10-test>]
注:many-to-many 查找的时候就的使用对象来查找了,不能使用数字来查找了
docs: https://docs.djangoproject.com/en/1.8/topics/db/examples/many_to_many/