【转载】django 对象的对应关系

转载自:https://www.cnblogs.com/zhaoyingjie/p/6984957.html

当在 model 定义是添加了 ForeignKey, OneToOneFiedl, ManyToMangField 的字段时, model 会自动生成相关 API 来获取相关数据。

One-To-Many 关系

1、正向获取 父表 to 子表
如果一个 model 包含有 ForeignKey 字段, 这个 model 的对象可以方便的获取与之关联的另一个 model 的对象。
例如: 获取 Entry 对象对应的 Blog 对象

1

2

3

4

5

6

e = Entry.objects.get(id=2)

e.blog # 返回通过外键关联的 blog 对象

#如果要更新 e 对象的 blog 属性

b = Blog.objects.get(id=3)

e.blog = b

e.save() # 执行根系操作,

 

one-to-many 关系在第一次使用后将会被缓存

1

2

3

e = Entry.objects.get(id=2)

print(e.blog) # 查询数据, 并将数据缓存

print(e.blog) # 不查询数据库, 之间中缓存中读取

 

使用 QuerySet 的 select_related() 方法时, 会将相应的 one-to-many 关系的对象都预先取出来并缓存, 在真正使用时就不会访问数据库

1

2

3

e = Entry.objects.select_related().get(id=2)

print(e.blog) # 不查询数据库

print(e.bong) # 不查询数据库

 

2、反向获取 子表 to 父表
如果 model A 通过 ForeignKey字段 field 与 model B 想关联。 B 对象可以通过 model Manager 去访问与之对应的所有的 A 对象。 默认的, 这个 model Manage 名为 foo_set, 其中 foo 是拥有外键那个 model 名的小写, 即 a_set()
例: 通过 Blog 对象查询 Entry 对象:

1

2

3

4

5

6

# 查询与 Blog 对象 b 关联的所有 entry 对象

b = Blog.objects.get(pk=2)

b.entry_set.all()

 

# 查询与 Blog 对象 b 关联的 entry 对象中 headline 包含 'Lennon' 的

b.entry_set.filter(headline__contains='Lennon')

 

如果在定义 ForeignKey 字段时 通过 related_name 可以更改这个默认的 foo_set() Manage 方法。
例如: 将最顶部的 Entry Model 中的 blog 字段修改成如下: blog = ForeignKey(Blog, related_name=’entries’), 上面的代码中的 entry_set 就可以都改成 entries。

1

2

3

4

5

6

# 查询与 Blog 对象 b 关联的所有 entry 对象

b = Blog.objects.get(pk=2)

b.entries.all()

 

# 查询与 Blog 对象 b 关联的 entry 对象中 headline 包含 'Lennon' 的

b.entries.filter(headline__contains='Lennon')

 

Many-To-Many 关系

对于 many-to-many 关系的 API 使用方法与上面的 one-to-many 关系的一致。区别在于, 在命名 ManyToMany 字段时, 字段名不要与其对应的 model 名的小写一致。例如 Entry 中, authors 字段名称不与其对应 Model(Author) 的小写名 author 相同。 这点与 blog 字段不同。

1

2

3

4

5

6

7

8

e = Entry.objects.get(id=3)

e.authors.all() # 返回 e 对象对应的所有 authors

e.authors.count() # authors 的数量

e.authors.filter(name__contains='John') # 返回名字中包含 John 的作者

 

a = Author.objects.get(id=5)

# 返回所有与 a 对象对应的 Entry 对象

a.entry_set.all()

 

One-To-One 关系

One-to-one 关系同 many-to-one 非常相似, API 用法与 many-to-one 的基本也基本一致

1

2

3

4

5

6

class EntryDetail(models.Model):

entry = models.OneToOneField(Entry, on_delete=models.CASCADE)

details = models.TextField()

 

ed = EntryDetail.objects.get(pk=3)

en.entry # 返回与之对应的 Entry 对象

 

与 many-to-one 不同的是其反向查找, 如下:

1

2

3

4

5

6

7

8

e = Entry.objects.get(pk=3)

# 取得与 Entry 对象对应的 EntryDetail 对象,

# 只需调用 EntryDetail 的小写 entrydetail 即可

e.entrydetail

 

#更新

e.entrydetail = ed2

e.save()

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
智慧校园整体解决方案是响应国家教育信息化政策,结合教育改革和技术创新的产物。该方案以物联网、大数据、人工智能和移动互联技术为基础,旨在打造一个安全、高效、互动且环保的教育环境。方案强调从数字化校园向智慧校园的转变,通过自动数据采集、智能分析和按需服务,实现校园业务的智能化管理。 方案的总体设计原则包括应用至上、分层设计和互联互通,确保系统能够满足不同用户角色的需求,并实现数据和资源的整合与共享。框架设计涵盖了校园安全、管理、教学、环境等多个方面,构建了一个全面的校园应用生态系统。这包括智慧安全系统、校园身份识别、智能排课及选课系统、智慧学习系统、精品录播教室方案等,以支持个性化学习和教学评估。 建设内容突出了智慧安全和智慧管理的重要性。智慧安全管理通过分布式录播系统和紧急预案一键启动功能,增强校园安全预警和事件响应能力。智慧管理系统则利用物联网技术,实现人员和设备的智能管理,提高校园运营效率。 智慧教学部分,方案提供了智慧学习系统和精品录播教室方案,支持专业级学习硬件和智能化网络管理,促进个性化学习和教学资源的高效利用。同时,教学质量评估中心和资源应用平台的建设,旨在提升教学评估的科学性和教育资源的共享性。 智慧环境建设则侧重于基于物联网的设备管理,通过智慧教室管理系统实现教室环境的智能控制和能效管理,打造绿色、节能的校园环境。电子班牌和校园信息发布系统的建设,将作为智慧校园的核心和入口,提供教务、一卡通、图书馆等系统的集成信息。 总体而言,智慧校园整体解决方案通过集成先进技术,不仅提升了校园的信息化水平,而且优化了教学和管理流程,为学生、教师和家长提供了更加便捷、个性化的教育体验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值