1. 程式人生 > >django進階

django進階

set django any rim 無法 div key ddr 列表

多對多:
創建多對多:
方式一:自定義關系表

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進階