【转载】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()

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章