zoukankan      html  css  js  c++  java
  • Python学习第151天(Django之多对多)

    应用场景

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

    创建表

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

    NO.1

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

    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
    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

    #多对多自定义创建表
        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
        )

    创建数据

    初始化数据
        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、获取大力用户
        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)

    查询数据​

    #查询数据
      #第一种方式
        #正向查
        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

    重点:多对多的正向和反向问题。


  • 相关阅读:
    localtime函数
    crontab命令加载和使用
    CentOS安装并查看lm_sensors CPU温度监控
    linux查看cpu核数和内存指令
    Unable to start debugging. Unexpected GDB output from command "-environment -cd xxx" No such file or
    EXCEL总结学习
    1.战前准备-字符的输入与输出
    10枚举,结构,联合
    C语言学习目录
    CAD的基础1
  • 原文地址:https://www.cnblogs.com/xiaoyaotx/p/13493200.html
Copyright © 2011-2022 走看看