• 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/

  • 相关阅读:
    MYSQL数据类型——字符串类型
    MYSQL——记录长度
    MYSQL数据类型——时间日期类型
    MYSQL数据类型——数值类型
    为什么在 IDEA jsp 中直接使用 out.println 会出错
    花指令行为大赏
    EasyCpp 题解
    [SUCTF2019] hardcpp 题解
    洛谷 P1650 田忌赛马题解
    Dict 协议是什么
  • 原文地址:https://www.cnblogs.com/zhaogaolong/p/5220975.html
Copyright © 2020-2023  润新知