多对多 方法一 :双外键关联 自定义关系表 自定义 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',on_delete=models.CASCADE) classs Application(models.Model): name = models.CharField(max_length=32) class HostToApp(models.Model): hobj = models.ForeignKey(to='Host',to_field='nid',on_delete=models.CASCADE) aobj = models.ForeignKey(to='Application',to_field='id',on_delete=models.CASCADE) 第三张表 往多对多加数据 HostToApp.objects.create(hobj_id=1,aobj_id=2) 方法二:自动创建关系表 只能创建三列 class Application(models.Model): name = models.CharField(max_length=32) r = models.ManyToManyField('Host') 无法直接对第三张表进行操作 通过r进行间接操作 obj = Application.objects.get(id=1) 选定了 Application id = 1 obj.name 增加 obj.r.add(2)在第三张表 application id=1 host id为2 obj.r.add(*[1,2,3,4]) application id = 1 host id=1 , 2 , 3, 4 删除 obj.r.remove(1) obj.r.remove(2,4) obj.r.remove(*[1,2,3]) 清空 obj.r.clear() 删除有application id = 1的所有行 修改 obj.r.set([3,5,7]) 做完这个只保存这个关系 aid=1 hid=3 aid=1 hid=5 查找/获取 obj.r.all() 为host对象“列表” queryset for host in obj.r.all(): print(host.name) 多选select <select id="host_list" name="host_list" multiple> {%for row in b_list%} <option value="{{row.id}}">{{op.caption}}<option> {% endfor %} <select> $.ajax({ url: '/ajax_add_app', // data: {'user': 123,'host_list': [1,2,3,4]}, data: $('#add_form').serialize(), #将当前标签下的数据全部提交 type: "POST", dataType: 'JSON', // 内部 自身转换 traditional: true, //当需要发列表时,需添加这个 success: function(obj){ console.log(obj); }, error: function () { } }) // 如果发送到后台 // /* obj = models.Application.objects.get(id=ai) obj.name = "新Name" obj.save() obj.r.set([1,2,3,4]) */ position:fixed absolute relative 作业: 主机管理: 增加编辑删除 应用管理: 增加编辑删除