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

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


  • 相关阅读:
    PCA算法的最小平方误差解释
    windows下面安装Python和pip终极教程
    理解C/C++的复杂声明
    C++的特殊预处理定义#、##和#@
    虚拟机中linux系统无法打开原保存的显示器配置解决方法
    Visual C++内存泄露检测—VLD工具使用说明
    C++重载、覆盖与隐藏——转载
    python爬虫实战(二)--------千图网高清图
    Linux常用命令12
    Linux常用命令11
  • 原文地址:https://www.cnblogs.com/xiaoyaotx/p/13493200.html
Copyright © 2011-2022 走看看