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表和第三张表
主机管理与应用管理
- 主机管理:增删改查
- 应用管理:增删改查