Django多对多模型自定义中间媒介(through)在运行期的表现

Stella981
• 阅读 544

使用自定义中间媒介来实现多对多关系的时候,主要的目的是在中间媒介中保存关系的特有属性。举个例子,比如学生与课程之间的关系就属于多对多的,而且当学生与课程建立关系之后随之还会产生附属的属性,如:成绩。

如下例:

<!-- lang: python -->
class Student(models.Model):
    name = models.CharField(max_length=5)
    cources = models.ManyToManyField(Course, through='StudentCourse')
class Course(models.Model):
    name = models.CharField()
class StudentCourse(models.Model):
    student = models.ForeignKey(Student)
    course = models.ForeignKey(Course)
    score=models.FloatField()

正常的情况下,我们期望能够通过如下方式访问到学生的所选课程及成绩:

<!-- lang: python --->
cources = Student.objects.get(id=1).cources
for c in cources:
    print 'Course:%s Score:%s\n' % (c.name,c.score)

实际的表现是,会产生一个运行期错误:找不到score字段。

究其原因就是因为Student.cources在运行期被Django设置为与Cources相关的Manager而不是我们预期的与StudentCourse相关的Manager。

实现以上需求实际上也非常简单,只对代码稍加调整:

<!-- lang: python --->
cources = Student.objects.get(id=1).studentcourse_set
for c in cources:
    print 'Course:%s Score:%s\n' % (c.name,c.score)

原因是,从StudentCourse角度,他是建立量到两个模型(Student,Course)的多对1关系,Django在启动时,会自动在其关联的模型上建立"[model]_set"的属性,就想常规的多对一关系一样——实际上他就是常规的多对一关系,只不过Student让其充当另外的角色罢了。

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
待兔 待兔
5个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Stella981 Stella981
3年前
Django之ORM(多对多)
一、ManyToManyField1、classRelatedManager"关联管理器"是在一对多或者多对多的关联上下文中使用的管理器。它存在于下面两种情况:1.外键关系的反向查询2.多对多关联关系简单来说就是当 点后面的对象 可能存在多个的时
Stella981 Stella981
3年前
Django中模型层中ORM的多表操作
ORM的多表创建(一对一.一对多,多对多):1模型创建  实例:我们来假定下面这些概念,字段和关系作者模型:一个作者有姓名和年龄。作者详细模型:把作者的详情放到详情表,包含生日,手机号,家庭住址等信息。作者详情模型和作者模型之间是一对一的关系(onetoone)出版商模型:出版
Stella981 Stella981
3年前
Hibernate利用关联关系操纵对象
Hibernate利用关联关系操纵对象数据对象之间关联关系有一对一、一对多及多对多关联关系。在数据库操作中,数据对象之间的关联关系使用JDBC处理很困难。本节讲解如何在Hibernate中处理这些对象之间的关联关系。本节使用到4个类,它们分别是Student(学生)、Card(学生证)、Group(班级)和Cou
Stella981 Stella981
3年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Stella981 Stella981
3年前
Django框架(七):模型(三) 关联、模型类的属性
1\.关联1.1模型类关系关系型数据库的关系包括三种类型:ForeignKey:一对多,将字段定义在多的一端中。ManyToManyField:多对多,将字段定义在任意一端中。OneToOneField:一对一,将字段定义在任意一端中。1.1.1一对多关系
Wesley13 Wesley13
3年前
3 OneToMany ManyToMany MappedBy Cascade
1双向1N关联对于1N关联,Hibernate推荐使用双向关联,而且不要让1的一方控制关联关系,而使用多的一方控制关联关系。a.一的一方 表示班级@Entity@Table(name"team_1")publicclassTeam{@Id@Gen
Stella981 Stella981
3年前
Hibernate 单向的一对多关联映射
单向的一对多关联关系(OnetoMany)对象模型关系分析:少的一端:会通过引用一个多端的集合对象,建立对象模型关系多的一端:没有任何变化,不知道和少的一端存在着关系。关系模型分析:少的一端:没有任何变化多的一端:会和少的一端建立外键关系使用时需要少的一端所对应的XXX.hbm.xml中进行配置<bagname"对多的
Wesley13 Wesley13
3年前
MySQL关于用户关注粉丝表的设计方案
一、数据结构分析用户关注粉丝是一个多对多的数据模型,分析对象的数据特征,我们给每个用户设计一个关注者属性和粉丝属性,用于存储用户的关注者id和粉丝id,如用户1:$arr1\'follow''\2,3,4\,'fans'\4,5,6\,\二、用户逻辑关系梳理