• 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>
  • 相关阅读:
    Ruby学习笔记5: 动态web app的建立 (2)
    Ruby学习笔记4: 动态web app的建立
    Ruby学习笔记3:Rendering(渲染)和 Redirect(重定向)
    对互联网垂直社交产品的分析
    测试 | 代码覆盖测试工具 | Eclemma
    Jquery | 基础 | 事件的链式写法
    Jquery | 基础 | html()
    Serervlet | 慕课课程实战 | 编写登录逻辑
    Jquery | 外部插入节点
    Jquery | 基础 | .hover()
  • 原文地址:https://www.cnblogs.com/lixiang1013/p/7784403.html
Copyright © 2020-2023  润新知