zoukankan      html  css  js  c++  java
  • 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/

  • 相关阅读:
    ELK7.X中配置x-pack
    ELK报错及解决方案
    ELK + filebeat集群部署
    CentOS7.6中 KVM虚拟机内存、CPU调整
    Linux 设置定时清除buff/cache的脚本
    Nginx中配置https中引用http的问题
    使用Docker搭建Jumpserver堡垒机
    CenterOS7中解决No package mysql-server available.
    Tomcat启动慢的原因及解决方法
    记录 之-- java 的一些小技巧
  • 原文地址:https://www.cnblogs.com/zhaogaolong/p/5220975.html
Copyright © 2011-2022 走看看