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

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


  • 相关阅读:
    使用 asp.net mvc和 jQuery UI 控件包
    ServiceStack.Redis 使用教程
    HTC T8878刷机手册
    Entity Framework CodeFirst 文章汇集
    2011年Mono发展历程
    日志管理实用程序LogExpert
    使用 NuGet 管理项目库
    WCF 4.0路由服务Routing Service
    精进不休 .NET 4.0 (1) asp.net 4.0 新特性之web.config的改进, ViewStateMode, ClientIDMode, EnablePersistedSelection, 控件的其它一些改进
    精进不休 .NET 4.0 (7) ADO.NET Entity Framework 4.0 新特性
  • 原文地址:https://www.cnblogs.com/xiaoyaotx/p/13493200.html
Copyright © 2011-2022 走看看