前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Django基础篇-表关联对象

Django基础篇-表关联对象

作者头像
小团子
发布2019-07-18 11:09:26
1.2K0
发布2019-07-18 11:09:26
举报
文章被收录于专栏:数据云团数据云团
  • 表关联对象
  • 多表查询

学生的学院 —— 正向查

学院的学生 —— 反向查

①表关联对象

可以在项目目录下通过 python manage.py shell 进入到当前目录下的 python 的 idle。

  • 前向查询

如果一个模型具有 ForeignKey,那么该模型的实例将可以通过属性访问关联的(外部)对象。

>>> from .models import Department, Student, Course

>>> s1 = Students.objects.get(s_id=1)

>>> s1

<Student: Student<s_id=1,s_name=yuntuan>>

>>> s1.department

<Department: Department<d_id=5,d_name=IT>>

# 学院

# 学生

# 课程

# 成绩

可以通过外键属性获取和设置。对外键的修改不会保存到数据库中,直至调用 save()。

  • 反向查询

如果模型 1 有一个 ForeignKey,那么该 ForeignKey 所指向的模型 2 实例可以通过一个管理器 返回前面有 ForeignKey 的模型 1 的所有实例。

默认情况下,这个 管理器 的名字为 foo_set,其中 foo 是源模型的小写名称。

  • 可以在 ForeignKey 定义时设置 related_name 参数来覆盖 foo_set 的名称。

# 例如:Student 模型改成

department = models.ForeignKey('Department', related_name='student'),那么实例代码改成这样

  • 处理关联对象的其他方法

add(obj1, obj2, ...)

添加的已经存在数据库的数据

添加指定的模型对象到关联的对象集中。(一对多,多对多)

create(**kwargs)

添加不存在的数据,将数据直接存入数据库,创建一个新的对象,将它保存并放在新创建的对象。(一对一,多对多)

remove(obj1, obj2, ...)

从关联的对象集中删除指定的模型对象。(多对多)

删除的是关系表中的数据

clear()

从关联的对象集中删除所有的对象。(多对多)

>>> s3.course.clear()

注意:

对于所有类型的关联字段,add()、create()、remove() 和 clear()都会马上更新数据库。在关联的任何一端,都不需要再调用 save() 方法。

直接赋值

②多表查询

Django 提供一种强大而又直观的方式来“处理”查询中的关联关系,它在后台自动帮你处理 JOIN。 若要跨越关联关系,只需使用关联的模型字段的名称,并使用双下划线分隔,直至你想要的字段:

这种跨越可以是任意的深度。

它还可以反向工作。若要引用一个“反向”的关系,只需要使用该模型的小写的名称。

当你基于 ManyToManyField 或反向的 ForeignKey 来过滤一个对象时,有两种不同种类的过滤器。考虑 Department/Student 关联关系 (一对多的关系)。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-01-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 数据云团 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
数据库
云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档