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方式
原文地址:https://www.cnblogs.com/todayisafineday/p/8783658.html