zoukankan      html  css  js  c++  java
  • 外键应用(foreignkey)、多对多

    1.创建model:

    定义hv表,保存hv server infors;

    定义vm表,保存vm infors;

    一个vm只能对应一台hv server;一台hv server可以包含有多台vm

    class hv(models.Model):  
        name=models.CharField(max_length=100,unique=True) # unique不需要,primary_key=True
        ip=models.GenericIPAddressField()
        def __str__(self):
            return self.name
    
    class vm(models.Model):  
        hvname = models.ForeignKey(hv) #关联到class hv(在vm库中会自动创建名为 hvname_id的字段,自动关联hv表中的id字段),
        name = models.CharField(max_length=100)
        cpu = models.CharField(max_length=100)
        def __str__(self):
            return self.name#,self.hvname (如果返回两个值,则在查询时返回的是一个tuple,会报错)
    
    class vm2(models.Model):
        hvname = models.ForeignKey(hv,to_field='name') #关联到class hv,并指定关联字段name,hv中的name也设置为primarykey,其用法与class vm不变,只是在直接select table vm2的时候,hvname显示为hv的name字段值,而不是默认的id字段值
        name = models.CharField(max_length=100)
        mem = models.IntegerField()
        def __str__(self):
            return self.name

    2.新建对象

    hv中新建对象:

     hv.objects.create(name='hv01',ip='192.168.0.1')
     hv.objects.create(name='hv02',ip='192.168.0.2')

    vm中新建对象,hvname需要关联hv中的主键,此处默认为其id列

    h=hv.objects.get(name='hv01')
    v=vm()
    v.name='vm02'
    v.cpu='4c'
    v.hvname=h #关联hv
    v.save()
    
    h2=hv.objects.get(name='hv02')
    v=vm()
    v.hvname=h2 #关联hv
    v.name='vm10'
    v.cpu='4c'
    v.save()

    查询hv,vm表结果如下:

    sqlite> select * from aptest_hv;
    1|hv01|192.168.0.1
    2|hv02|192.168.0.2
    sqlite> select * from aptest_vm;
    1|vm01|8c|1  #最后一个字段1即对应hv的id列
    2|vm02|4c|1
    3|vm10|4c|2

     查询对象:

    #通过对象访问相关联表数据的方法,即用_set。但是这种方法只能是相关类访问定义了关系的类(主键类访问外键类)
    #例:在hv中查询某个hv server所有的vm实例
    h=hv.objects.get(name='hv0')
    h.vm_set.all() #返回[<vm: vm01>, <vm: vm02>]
    
    #在vm中查询其对应的hv server
    v=vm.objects.get(name='vm01')
    v.hvname #返回<hv: hv01>,查询vm01的hv server

    #在vm表中查询hv的ip为192.168.0.1的条目

    vm.objects.filter(hvname__ip='192.168.0.1') #hvname是foreignkey映射的hv中的字段名称,ip是需要在hv中查询的字段

    删除对象:

    v=vm.objects.get(name='vm10')
    v.delete() #删除一条vm记录
    
    h=hv.objects.get(name='hv03')
    h.delete() #删除一条hv记录,则相应的vm也会被删除

     注:vm中的外键字段hvname在通过web前端输入时,必须要输入正确的值(字符串即可),如hv01,hv02,否则会报错如下。所以最好是通过下拉列表的方式提供值,供用户选择

    关联对象参考:http://python.usyiyi.cn/django/ref/models/relations.html

    多对多,一对一参考:http://blog.csdn.net/hackerain/article/details/39196495

    一个作者对应多本书,一本书有多个作者:

    from:http://blog.csdn.net/shangliuyan/article/details/7920037

    model:

    class Author(models.Model):    
        first_name = models.CharField(max_length=30)    
        last_name = models.CharField(max_length=40)    
        email = models.EmailField()    
            
    class Book(models.Model):    
        title = models.CharField(max_length=200)    
        authors = models.ManyToManyField(Author) 

    1.从书籍出发获取作者

    b = Book.objects.get(id=50)  
    b.authors.all()  
    b.authors.filter(first_name='Adam')  

    2.从作者出发获取书籍

    a = Author.objects.get(id=1)  
    a.book_set.all()  

    添加对象方法:

    a = Author.objects.get(id=1)  
    b = Book.objects.get(id=50)  
    b.authors.add(a)  

    删除对象:

    a = Author.objects.get(id=1)  
    b = Book.objects.get(id=50)  
    b.authors.remove(a) 或者 b.authors.filter(id=1).delete()  

    对已经存在的表添加映射关系:http://www.redicecn.com/html/Python/20120505/399.html

  • 相关阅读:
    MySQL基础知识总结
    PHP常见算法
    PHP程序功能设计
    SVN配置使用及移植
    推荐一个SpringBoot + Vue + MyBatis 音乐网站项目
    累积sql常用查询语句「Oracle」
    Nginx服务器设置http/https正向代理,使用ngx_http_proxy_connect_module模块
    squid配置文件
    nginx命令
    k8s与Docker有啥关系
  • 原文地址:https://www.cnblogs.com/dreamer-fish/p/5420678.html
Copyright © 2011-2022 走看看