15)django-ORM(多对多关系)

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>
原文地址:https://www.cnblogs.com/lixiang1013/p/7784403.html