首页 > 代码库 > django进阶

django进阶

多对多:
创建多对多:
方式一:自定义关系表

class Host(models.Model):
    nid=models.AutoField(primary_key=True)
    hostname=models.CharField(max_length=32,db_index=True)
    ip=models.GenericIPAddressField(db_index=True)
    port=models.IntegerField()
    b=models.ForeignKey(‘Business‘,to_field=‘id‘)

#自定义关联
class HostToApp(models.Model):
     hobj=models.ForeignKey(to=‘Host‘,to_fields=‘nid‘)
     aobj=models.ForeignKey(to=‘Application‘,to_fields=‘id‘)

对表的操作和foreignkey一样,并且可以直接对这个表进行操作
HostToApp.objects.create(hobj_id=1,aobj_id=2)



方式二:自动创建关系表

 1 class Host(models.Model):
 2     nid=models.AutoField(primary_key=True)
 3     hostname=models.CharField(max_length=32,db_index=True)
 4     ip=models.GenericIPAddressField(db_index=True)
 5     port=models.IntegerField()
 6     b=models.ForeignKey(‘Business‘,to_field=‘id‘)
 7 
 8 class Application(models.Model):
 9       name=models.CharField(max_length=64)
10       auto=models.ManyToManyField("Host")

技术分享

缺点就是无法直接对第三张表进行操作,只能间接的方式来操作并且也无法在这个表增加多余字段
#现获取对象
obj = Application.objects.get(id=1)

# 然后间接操作第三张表中的内容

#增加
obj.r.add(1)#Application=1  host=1   obj中已经存在了app id 所以这里的add=1就是host表中的id
obj.r.add(2)#Application=1  host=2
obj.r.add(2,3,4)#Application=1  host=2/3/4  
obj.r.add(*[1,2,3,4])

#移除
obj.r.remove(1)
obj.r.remove(2,4)
obj.r.remove(*[1,2,3])

#清空obj中的app  id =1的所有内容
obj.r.clear()

#更新
obj.r.set([3,5,7])

# 所有相关的主机对象“列表” QuerySet
obj.r.all()

 

增删改查例子  

def app(reques):
    obj=models.Application.objects.all()
    print(obj)
    for i in obj:
        #查询
        print(i.name,i.auto.all())

    #增加app项目并且返回这个obj对象
    #obj=models.Application.objects.create(name=‘oracle‘)
    #增加1,3,4host到app
    #obj.auto.add(*[1,4,3])


    #删除
    # obj=models.Application.objects.get(id=1)
    # obj.auto.remove(1)
    # return render(reques,‘app.html‘,{‘obj‘:obj})
    return HttpResponse("ok")

 

django进阶