1. 程式人生 > >15)django-ORM(多對多)

15)django-ORM(多對多)

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(多對多)