Django框架 之 ORM中介模型

中介模型

处理类似搭配 pizza 和 topping 这样简单的多对多关系时,使用标准的ManyToManyField  就可以了。但是,有时你可能需要关联数据到两个模型之间的关系上。

例如,有这样一个应用,它记录音乐家所属的音乐小组。我们可以用一个ManyToManyField 表示小组和成员之间的多对多关系。但是,有时你可能想知道更多成员关系的细节,比如成员是何时加入小组的。

对于这些情况,Django 允许你指定一个中介模型来定义多对多关系。 你可以将其他字段放在中介模型里面。源模型的ManyToManyField 字段将使用through 参数指向中介模型。对于上面的音乐小组的例子,代码如下:


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

from django.db import models

 

class Person(models.Model):

    name = models.CharField(max_length=128)

 

    def __str__(self):              # __unicode__ on Python 2

        return self.name

 

class Group(models.Model):

    name = models.CharField(max_length=128)

    members = models.ManyToManyField(Person, through=‘Membership‘)

 

    def __str__(self):              # __unicode__ on Python 2

        return self.name

 

class Membership(models.Model):

    person = models.ForeignKey(Person)

    group = models.ForeignKey(Group)

    date_joined = models.DateField()

    invite_reason = models.CharField(max_length=64)

既然你已经设置好ManyToManyField 来使用中介模型(在这个例子中就是Membership),接下来你要开始创建多对多关系。你要做的就是创建中介模型的实例:


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

>>> ringo = Person.objects.create(name="Ringo Starr")

>>> paul = Person.objects.create(name="Paul McCartney")

>>> beatles = Group.objects.create(name="The Beatles")

>>> m1 = Membership(person=ringo, group=beatles,

...     date_joined=date(1962816),

...     invite_reason="Needed a new drummer.")

>>> m1.save()

>>> beatles.members.all()

[<Person: Ringo Starr>]

>>> ringo.group_set.all()

[<Group: The Beatles>]

>>> m2 = Membership.objects.create(person=paul, group=beatles,

...     date_joined=date(196081),

...     invite_reason="Wanted to form a band.")

>>> beatles.members.all()

[<Person: Ringo Starr>, <Person: Paul McCartney>]

与普通的多对多字段不同,你不能使用add、 create和赋值语句(比如,beatles.members = [...])来创建关系:


1

2

3

4

5

6

# THIS WILL NOT WORK

>>> beatles.members.add(john)

# NEITHER WILL THIS

>>> beatles.members.create(name="George Harrison")

# AND NEITHER WILL THIS

>>> beatles.members = [john, paul, ringo, george]

为什么不能这样做? 这是因为你不能只创建 Person和 Group之间的关联关系,你还要指定 Membership模型中所需要的所有信息;而简单的addcreate 和赋值语句是做不到这一点的。所以它们不能在使用中介模型的多对多关系中使用。此时,唯一的办法就是创建中介模型的实例。

remove()方法被禁用也是出于同样的原因。但是clear() 方法却是可用的。它可以清空某个实例所有的多对多关系: 


1

2

3

4

5

>>> # Beatles have broken up

>>> beatles.members.clear()

>>> # Note that this deletes the intermediate model instances

>>> Membership.objects.all()

[]

原文地址:https://www.cnblogs.com/hanbowen/p/9567438.html

时间: 2024-09-29 08:14:45

Django框架 之 ORM中介模型的相关文章

ORM中介模型 + auth模块

ORM中介模型 Django 允许你指定一个中介模型来定义多对多关系. 你可以将其他字段放在中介模型里面.源模型的ManyToManyField 字段将使用through 参数指向中介模型.对于上面的音乐小组的例子,代码如下: 注意:ManyToMany("Student",through="Course_students") ForeignKey("xxx") class student courst id name id name id na

第六章 Django框架学习——ORM详解

第六章 Django框架学习--ORM介绍与常用方法 一.ORM介绍 二.ORM中的常用字段和参数 三.ORM中的关系字段--一对一(OneToOneField) 四.ORM中的关系字段--多对多(ManyToManyField) 五.ORM中的元信息 一.ORM介绍(部分内容前面的章节已经介绍过,此处只做简单介绍) 什么是ORM(what): ORM是通过使用描述对象和数据库之间映射的元数据,将程序中的对象自动持久化到关系数据库中. Django中的ORM: Django配置数据库 1.在se

Django框架05 /orm单表操作

目录 Django框架05 /orm单表操作 昨日内容回顾 今日内容 orm单表操作 对象关系映射(object relational mapping) 1.orm介绍 2.增: 3.时间问题 4.删 5.改 6.批量插入 -- bulk_create 7.查询api 8.基于双下划线的模糊查询 -- filter双下划线查询 9.总结 总结1 总结2 Django框架05 /orm单表操作 昨日内容回顾 模板相关 模板继承(母版继承) 1. 创建一个xx.html页面(作为母版,其他页面来继承

Django框架(二):设计模型

1. 设计模型 我们之前操作数据库是通过写sql语句,那么能不能不写sql语句就可以操作数据库呢? 当然可以,这就要使用ORM框架了. 1.1 ORM框架 O是object,也就类对象的意思,R是relation,翻译成中文是关系,也就是关系数据库中数据表的意思,M是mapping,是映射的意思.在ORM框架中,它帮我们把类和数据表进行了一个映射,可以让我们通过类和类对象就能操作它所对应的表格中的数据.ORM框架还有一个功能,它可以根据我们设计的类自动帮我们生成数据库中的表格,省去了我们自己建表

django框架基础-ORM操作-长期维护-20191213

###############    ORM介绍和使用mysql的基本配置    ################ # ORM简介 # O是object,对象 # R是relation,关系,这是关系数据库中的表 # M是mapping,映射 # 在django里面主要是在models.py文件里面设计模型类, ########################### # ORM另一个作用:根据设计的类生成数据库中的表 # django中使用ORM创建表 # 这种可以使用写Python语句,然后自

python3开发进阶-Django框架的ORM常用字段和参数

阅读目录 常用字段 字段合集 自定义字段 字段参数 关系参数 多对多的关联关系的三种方式 一.常用字段 AutoField int自增列,必须填入参数 primary_key=True.当model中如果没有自增列,则自动会创建一个列名为id的列. IntegerField 一个整数类型,范围在 -2147483648 to 2147483647.  (最大十位) CharField 字符类型,必须提供max_length参数, max_length表示字符长度. DateField 日期字段,

Django框架之ORM的相关操作

一.一般操作 from django.db import models import datetime # Create your models here. class Author(models.Model): id=models.AutoField(primary_key=True) name=models.CharField(max_length=20) # 以下是测试字段 numtest=models.IntegerField() datetest=models.DateField(nu

Django框架之ORM的相关操作之多对多三种方式(五)

在之前的博客中已经讲述了使用ORM的多对多关系表,现在进行总结一下: 1.ORM自动帮助我们创建第三张表 2.手动创建第三张表,第三张表使用ForeignKey指向其他的两张表关联起来 3.手动创建第三张表,使用的和ORM帮助我们创建的一样(这种方法暂时先不赘述) 该博客重点讲一下第二种方法:手动创建第三张表,并且第三张表使用ForeignKey指向其他两张表关联起来 以作者和出版的书进行举例子.作者可以写多本书,书也可以有多个作者,书与作者的关系就是多对多的关系 1.创建两张各自的表(作者表和

django框架之模型

ORM简介 ORM,全拼Object-Relation Mapping,中文意为对象-关系映射,是随着面向对象的软件开发方法发展而产生的.面向对象的开发方法是当今企业级应用开发环境中的主流开发方法,关系数据库是企业级应用环境中永久存放数据的主流数据存储系统.对象和关系数据是业务实体的两种表现形式,业务实体在内存中表现为对象,在数据库中表现为关系数据.内存中的对象之间存在关联和继承关系,而在数据库中,关系数据无法直接表达多对多关联和继承关系.因此,对象-关系映射ORM系统一般以中间件的形式存在,主