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

Django--models多对多的更多相关文章

  1. day20 Django Models 操作,多表,多对多

    1 Django models 获取数据的三种方式: 实践: viwes def business(request): v1 = models.Business.objects.all() v2 = ...

  2. django models 类型整理 version:1.8.3

    django models 类型整理 version:1.8.3 网上百度到的最上面的一篇已经是11年的了,django变化很大,现在把1.8.3版的models类型大致整理了下贴出来 普通键部分 F ...

  3. django models 数据库操作

    django models 数据库操作 创建模型 实例代码如下 from django.db import models class School(models.Model): pass class ...

  4. Django中多对多关系的orm表设计

    作者的管理 1.设计表结构 出版社 书籍 作者 一个出版社出版多个书籍  1对多 书籍和作者的关系:一个作者写多本书,一本书可以是多个作者写.多对多 1)创建一张表,表中多对多的数据关系.使用 多对多 ...

  5. Python - Django - ORM 多对多表结构的三种方式

    多对多的三种方式: ORM 自动创建第三张表 自己创建第三张表, 利用外键分别关联作者和书,关联查询比较麻烦,因为没办法使用 ORM 提供的便利方法 自己创建第三张表,使用 ORM 的 ManyToM ...

  6. django models中的class meta

    Django models中的meta选项 通过一个内嵌类 "class Meta" 给你的 model 定义元数据, 类似下面这样: class Foo(models.Model ...

  7. Django models 操作高级补充

    Django models 操作高级补充 字段参数补充: 外键 约束取消 ..... ORM中原生SQL写法: raw connection extra

  8. Django models Form model_form 关系及区别

    Django models Form model_form

  9. Django models .all .values .values_list 几种数据查询结果的对比

    Django models .all .values .values_list 几种数据查询结果的对比

  10. django models数据类型

    Django Models的数据类型 AutoField IntegerField BooleanField true/false CharField maxlength,必填 TextField C ...

随机推荐

  1. WCF Failed to invoke the service. Possible causes: The service is offline or inaccessible

    今天写WCf 时遇到如下报错: 调试过程发现,各个过程都无异常,但是返回给调用端数据时出现如下错误. Failed to invoke the service. Possible causes: Th ...

  2. [Xamarin] 從Xamarin中呼叫 *.jar 的 library -建立.jar篇 (转帖)

    嗯,這篇我們來聊聊如何從Xamarin 中來呼叫,已經包好的.jar ,首先因為要讓測試順利,我們開一個Android Java 的專案 當然是Eclipse ,然後我們簡簡單單寫一個測試用的libr ...

  3. JDBC学习1:详解JDBC使用

    什么是JDBC JDBC(Java Database Connectivity),即Java数据库连接,是一种用于执行SQL语句的Java API,可以为多种关系数据库提供同一访问,它由一组用Java ...

  4. 作业3.2:psp

    PSP2.1 Personal Software Process Stages Time Planning 计划 20min Estimate 估计这个任务需要多长时间 3.5h Developmen ...

  5. 一天一小段js代码(no.3)

    //遍历属性,返回名值对 function outputAttributes(element){ var pairs = new Array(), attrName, attrValue, i, le ...

  6. video.js html5 视频播放器

    我个人感觉很不错 https://github.com/videojs/video.js <head> <title>Video.js | HTML5 Video Player ...

  7. 《30天自制操作系统》笔记(01)——hello bitzhuwei’s OS!

    <30天自制操作系统>笔记(01)——hello bitzhuwei's OS! 最初的OS代码 ; hello-os ; TAB=4 ORG 0x7c00 ; 指明程序的装载地址 ; 以 ...

  8. 使用IPostBackEventHandler让JavaScript“调用”回传事件

    在由ASP.NET所谓前台调用后台.后台调用前台想到HTTP——实践篇(二)通过自己模拟HTML标签事件与服务器交互,讲了ASP.NET的服务器控件是怎么render成HTML后市怎么“调用”后台方法 ...

  9. 虚拟化平台cloudstack(6)——使用maven:jetty调试

    调试环境 ubuntu 12.04 JDK1.7 apache-maven-3.10 eclipse 4.2 Juno mysql 5 apache ant JDK的配置和安装 安装可以参考: htt ...

  10. MVC5:使用Ajax和HTML5实现文件上传功能

    引言 在实际编程中,经常遇到实现文件上传并显示上传进度的功能,基于此目的,本文就为大家介绍不使用flash 或任何上传文件的插件来实现带有进度显示的文件上传功能. 基本功能:实现带有进度条的文件上传功 ...