django models ForeignKey Many-to-ManyField 操作

 

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

image

group table

image

还多出一个asset_host_host_group table

image

asset_host_host_group 就是我们在定义ManyToManyField 的对应表,该字段不会在

image

 

首先获取两个对象,一个是主机对象,一个是组对象

>>> 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表更新了数据

image

这就是实现了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/

posted @ 2016-02-26 16:58  zhaogaolong  阅读(1690)  评论(0编辑  收藏  举报