15)django-ORM(多對多)
阿新 • • 發佈:2017-11-04
ica quest all rim max 表操作 span integer protocol
django ORM多對多關系使用
一:多對多關系創建
多對多關系創建:分為兩種情況,手動創建和django自動創建
1)手動創建:自定義關系表
通過自定義表,通過models.ForeignKey創建關聯
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")
2)django自動創建關系表:通過models.ManyToManyField創建第三張表
第三張表是不可見的,只能通過關聯表訪問,比如:Application.r.XX
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") #多對多
兩種方式都使用,當關系需要增加其他列的時候,第一種方式(可定制)。方式二,只有兩個關聯表的ID,沒有其他字段,如果需要補充其他字段,使用方式1
二:多對多關系數據操作
方式1:HostToApp.objects.create(hobj_id=1,aobj_id=1)
方式2:無法直接對第三張表進行操作
先創建關系對象,通過對象訪問等
第三張表操作 #增加 obj.r.add(1)表示在第三張表裏增加了一個1 obj.r.add(2) obj.r.add(2,3,4) obj.r.add(*[1,2,3]) #列表數據需要在前面加*號 #刪除 obj.r.remove(1) obj.r.remove(2,3) obj.r.remove(*[1,2,3]) #清空對應關系為1的所有數據 obj.r.clear() #obj.set([3,5,6]) 如果這樣設置,數據庫裏只有3,5,6,其他都被刪除
obj.set([3,5,6])
#obj.r.all() 所有相關主機對象queryset
obj.r.all() #頁面要循環訪問數據
示例
def app(request): app_list=Application.objects.all() for app_tmp in app_list: print(app_tmp.name,app_tmp.r.all()) return render(request,"app.html") -------------------------- CDA <QuerySet [<Host: Host object>, <Host: Host object>]> DBA <QuerySet [<Host: Host object>]> def app(request): app_list=Application.objects.all() # for app_tmp in app_list: # print(app_tmp.name,app_tmp.r.all()) return render(request,"app.html",{"app_list":app_list}) <table border="1px"> <thead> <tr> <td>應用名稱</td> <td>應用主機列表</td> </tr> </thead> <tbody> {% for app in app_list %} <tr> <td>{{ app.name }}</td> <td>{% for r in app.r.all%} <~-- 循環訪問第三張表裏數據--> <span>{{ r.hostname }}</span> {% endfor %} </td> </tr> {% endfor %} </tbody> </table>
15)django-ORM(多對多)