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

最新文章

  1. &quot;无法删除数据库,因为该数据库当前正在使用&quot;问题解决
  2. Xilinx下载安装与在win10闪退问题解决方法
  3. Java提高篇——理解String 及 String.intern() 在实际中的应用
  4. 正则表达式测试器 beta_
  5. ssh免密码登录机器(使用公钥和秘钥进行加密来实现)
  6. cnodejs社区论坛3--发表话题
  7. bootstrap清除拟态框内添加新HTML再打开时会有缓存现象
  8. Ajax详解及其案例分析------如何获得Ajax对象,使用Ajax对象发送GET和POST请求,校验用户名,POST和GET请求时的乱码处理,实现级联的下拉列表
  9. August 4th, 2016, Week 32nd, Thursday
  10. stl的仿函数adapter
  11. 《MySQL必知必会》读书笔记
  12. 动态规划(斜率优化):BZOJ 3675 [Apio2014]序列分割
  13. js 验证表单 js提交验证类
  14. Mvc 6 中创建 Web Api
  15. SMO 的环境
  16. 五分钟学习React(四):什么是JSX
  17. Python入门测试
  18. 【EMV L2】终端风险管理(Terminal Risk Management)
  19. (转)python爬虫:http请求头部(header)详解
  20. linux系统中查看己设置iptables规则

热门文章

  1. Java中的四种引用
  2. Innosetup(pascal)标签控件label换行
  3. ES6那些事半功倍的新特性(一)
  4. textarea的placeholder属性内容折行显示(PC和移动端端)
  5. LVS负载均衡DR模式部署
  6. c#基础学习(0806)之可变参数、ref和out关键字的简单使用
  7. vb.net的String类型和Bytes转换(C#也适用)
  8. java自学-基本数据类型
  9. Idea生成Javadoc
  10. Android - Builder模式