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=‘[email protected]‘)

    models.HostAdmin.objects.create(username=‘dali‘,email=‘[email protected]‘)

    models.HostAdmin.objects.create(username=‘haojie‘,email=‘[email protected]‘)

添加数据


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

来自为知笔记(Wiz)

时间: 2024-08-04 03:43:45

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

django models 类型整理 version:1.8.3

django models 类型整理 version:1.8.3 网上百度到的最上面的一篇已经是11年的了,django变化很大,现在把1.8.3版的models类型大致整理了下贴出来 普通键部分 Field Params in database attention AutoField **options integer 在django代码内是自增 BooleanField **options boolean\bit   BinaryField [**options] blob   BigInt

Django 之 多对多查询与操作方法

多对多表之间关系表 models.py文件代码 from django.db import models # Create your models here. class Publisher(models.Model): id = models.AutoField(primary_key=True) name = models.CharField(max_length=64,null=False,unique=True) def __str__(self): return "publisher_

django models 数据库操作

django models 数据库操作 创建模型 实例代码如下 from django.db import models class School(models.Model): pass class Message(models.Model): pass class Teacher(models.Model): pass class Student(models.Model): GENDER_CHOICES = ( ('male', "男"), ('female', "女&q

Django Models的数据类型 汇总

转自http://apps.hi.baidu.com/share/detail/21922174#content Django Models的数据类型 AutoField IntegerField BooleanField true/false CharField maxlength,必填 TextField CommaSeparatedIntegerField maxlength,必填 逗号分隔 DateField auto_now 可选,每次动作都会更新 auto_now _add 可选,一

django models 中choices之用法举例

CHOICES常用做单选属性,下面举例在django models中人物性别的用法: 我们先定义一个模型,名字为Students ,这个Students 包含了名字和性别两个字段,代码如下: from django.db import models class Students(models.Model): GENDER_CHOICES = ( (u'M', u'Male'), (u'F', u'Female'), ) name = models.CharField(max_length=60)

django之多对多关系

django 1.7 定义多对多关系,使用 ManyToManyFiled. 本例中,文章Article可以在多个出版物Publication上发表,而出版物可以有多个文章对象. from django.db import models class Publication(models.Model): title = models.CharField(max_length=30) def __str__(self): return self.title class Meta: ordering

django ManyToManyField多对多关系

Django 的 ORM 有多种关系:一对一,多对一,多对多 各自定义的方式为 : 一对一: OneToOneField 多对一: ForeignKey 多对多: ManyToManyField 上边的描述太过数据而缺乏人性化,我们来更人性化一些: 多个属于一个,即 belong to :  ForeignKey,多个属于一个 一个有一个,即 has one: OneToOneField 一个有很多个,即 has many:  lots of A belong to B 与 B has many

6、django操作表多对多实战

图书管理系统表设计结构 author的id对应author_book的author_idbook的id对应author_book的book_id #########orm工具设置D:\mysite\polls\models.pyorm:对像关系映射,将Python语法自动转换成sql语句 from django.db import models #书 class Book(models.Model): id = models.AutoField(primary_key=True) # 自增的ID

Django models里的关系映射

一.一对一映射 1.什么是一对一 A表中的一条记录只能与B表中的一条记录相关联如:一夫一妻制 2.语法 允许在关联的两个类的任何一个类中 增加: 属性 = models.OneToOneField(Entry) 3.查询 class Wife(models.Model): ... author=models.OneToOneField(Author) 1.正向查询:通过wife 找 author wife = Wife.objects.get(id=1) author = wife.author

Django:表多对多查询、聚合分组、FQ查询、事务

1表多对多的关系查询 准备工作创建表结构 from django.db import models # Create your models here. class Publisher(models.Model): name = models.CharField(max_length=32, verbose_name="名称") def __str__(self): return self.name class Book(models.Model): title = models.Ch