• Django--models多对多


    多对多--ManyToMany


    应用场景

    在某表中创建一行数据时,有一个可以多选的下拉框(一对一是单选框)
    例如:创建用户信息,需要为用户指定多个爱好




    创建表

    两种方法,一个是利用Django自动为多对多创建关联的第三张表,另一种是自己手动创建关系表。

    NO.1

    根据Django中的代码,自动为多对多表创建一个第三张表对应关系

    1
    2
    3
    4
    5
    6
    7
    8
    class Host(models.Model):
        hostname = models.CharField(max_length=32)
        port = models.IntegerField()
     
    class HostAdmin(models.Model):
        username = models.CharField(max_length=32)
        email = models.CharField(max_length=32)
        host = models.ManyToManyField(Host)

    NO.2

    自定义多对多表,没有ORM都是自己生成

    models.py
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    class Host1(models.Model):
        hostname = models.CharField(max_length=32)
        port = models.IntegerField()
     
    class HostAdmin1(models.Model):
        username = models.CharField(max_length=32)
        email = models.CharField(max_length=32)
        host = models.ManyToManyField(Host1, through='HostRelation')
     
    class HostRelation(models.Model):
        c1 = models.ForeignKey(Host1)
        c2 = models.ForeignKey(HostAdmin1)
    view.py
    1
    2
    3
    4
    5
    6
    7
    8
    9
    #多对多自定义创建表
        models.HostRelation.objects.create(
            c1=models.Host1.objects.get(id=1),
            c2=models.HostAdmin1.objects.get(id=2)
        )
        models.HostRelation.objects.create(
            c1_id=2,
            c2_id=1
        )




    创建数据

    1
    2
    3
    4
    5
    6
    7
    初始化数据
        models.Host.objects.create(hostname='c1',port=80)
        models.Host.objects.create(hostname='c2',port=80)
        models.Host.objects.create(hostname='c3',port=80)
        models.HostAdmin.objects.create(username='root',email='1@live.com')
        models.HostAdmin.objects.create(username='dali',email='dali@live.com')
        models.HostAdmin.objects.create(username='haojie',email='haojie@live.com')




    添加数据

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #正向添加
        #目的,给大力分配两个主机的管理权限
        #1、获取大力用户
        admin_obj = models.HostAdmin.objects.get(username='dali')
        #2、获取指定的两个主机
        host_list = models.Host.objects.filter(id__lt=3)
        #3、将两个主机和大力添加到第三张对应表中
        admin_obj.host.add(*host_list)
      #反向添加
        host_obj = models.Host.objects.get(id=3)
        admin_list = models.HostAdmin.objects.filter(id__gt=1)
        host_obj.hostadmin_set.add(*admin_list)




    查询数据​

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    #查询数据
      #第一种方式
        #正向查
        admin_obj = models.HostAdmin.objects.all(id=1)
        for item in admin_obj:
            item.host.all()
        #反向查
        host_obj = models.Host.objects.get(id=1)
        host_obj.hostadmin_set.all()
      #第二种方式
        relation_list = models.HostRelation.objects.all()
        relation_list = models.HostRelation.objects.filter(c2__username='dali')
        for item in relation_list:
            print item.c1.hostname
            print item.c2.username





















  • 相关阅读:
    今天才知道的JavaScript的真实历史~[转]
    JQuery实现可编辑的表格
    详细记录ASP.NET中的图象处理
    使用javascript比较任意两个日期相差天数(代码)
    你所不知的 CSS ::before 和 ::after 伪元素用法
    javascript模拟post提交
    jQuery/javascript实现IP/Mask自动联想功能
    CSS 中的强制换行和禁止换行
    17.C++-string字符串类(详解)
    16.C++-初探标准库
  • 原文地址:https://www.cnblogs.com/daliangtou/p/5423914.html
Copyright © 2020-2023  润新知