zoukankan      html  css  js  c++  java
  • ORM操作之多对多 主机管理与应用管理

    ORM操作 

    多对多

    方式一:自定义关系表
    	class Host(models.Model):
    		nid = models.AutoField(primary_key=True)
    		hostname = models.CharField(max_length=32,db_index=True)
    		ip = models.GenericIPAddressField(protocol="ipv4",db_index=True)
    		port = models.IntegerField()
    		b = models.ForeignKey(to="Business", to_field='id')
    
    	class Application(models.Model):
    		name = models.CharField(max_length=32)
    	
    	class HostToApp(models.Model):
    		hobj = models.ForeignKey(to='Host',to_field='nid')
    		aobj = models.ForeignKey(to='Application',to_field='id')
    		status = models.CharField(max_length=32)
    		
    	操作关系表(与其他表操作一样):
    		modles.HostToApp.objects.create(hobj_id=1,aobj_id=2)
    				
    	优点:可以创建多列数据,而“自动创建关系表”仅能有3列数据
    
    			
    方式二:自动创建关系表
    	class Host(models.Model):
    		nid = models.AutoField(primary_key=True)
    		hostname = models.CharField(max_length=32,db_index=True)
    		ip = models.GenericIPAddressField(protocol="ipv4",db_index=True)
    		port = models.IntegerField()
    		b = models.ForeignKey(to="Business", to_field='id')
    
    	class Application(models.Model):
    		name = models.CharField(max_length=32)
    		r = models.ManyToManyField("Host")
    		
    	缺点:无法直接对第三张表进行操作,可以间接操作
    										
    	# 第三张表操作
    	增
    	obj.r.add(1)		# application_id=1, host_id=1,记(1,1)
    	obj.r.add(2)		# application_id=1, host_id=2,记(1,2)
    	obj.r.add(2,3,4)	# (1,2) (1,3) (1,4)
    	obj.r.add(*[1,2,3,4])	# (1, 1) (1,2) (1,3) (1,4)
    
    		例如:
    			obj = models.Application.objects.create(name=app_name)
    			obj.r.add(*host_list)
    	
    	删
    	obj.r.remove(1)		# 删除全部application_id=1, host_id=1,记(1,1)
    	obj.r.remove(2,4)		# (1,2)(1,4)
    	obj.r.remove(*[1,2,3])	# (1,1)(1,2)(1, 3)			
    	obj.r.clear()			# 删除application_id=1的全部关系
    		
    		例如
    			obj = models.Application.objects.filter(id=app_id).first()
    		    obj.r.clear()
    		    obj.delete()
    	
    	改
    	obj.r.set([3,5,7])		# 仅保留(1, 3) (1, 5) (1, 7)关系,若没有,就添加;其他删除
    		
    		例如:
    			obj = models.Application.objects.filter(id=app_id).first()
    		    obj.name = "DB"
    		    obj.save()
    		    obj.r.set([1,2,3])
    	
    	查
    	obj.r.all()	# 所有相关的主机对象“列表” QuerySet
    	obj.r.xxx 	# xxx可以是数据库表结构的任意操作,例如all().values,filter
    
    		例如:
    			app_list = models.Application.objects.all()
    
    			{% for app in app_list %}
    			    {% for host in app.r.all %}
    			        <span hid="{{ host.nid }}">{{ host.hostname }}</span>
    			    {% endfor %}
    			{% endfor %}
    
    	也可以通过application_set,从Host表中,查询到Application表和第三张表
    

    主机管理与应用管理

    1. 主机管理:增删改查
    2. 应用管理:增删改查
    • 实现方式:
      • ajax方式
      • 新URL方式
  • 相关阅读:
    dljd_(004_005)_jdbc编程步骤
    dljd_003_jdbc编程_概述
    dljd_002_通过接口降低代码的耦合度(2)
    dljd_001_通过接口降低代码的耦合度(1)
    dljd_(002-003)_什么是持久化
    dljd_001_由hibernate名称引出的相关知识
    001_学习26个英文字母
    06_dljd_mysql数据库常用操作
    05_dljd_mysql数据库表的介绍
    【数据结构】树状数组(简单名次树)
  • 原文地址:https://www.cnblogs.com/todayisafineday/p/8783658.html
Copyright © 2011-2022 走看看