关系映射
一对一映射
语法
# 在关联的两个类中的任何一个类中
# 不需要反向引用
属性 = models.OneToOneField(Entry)
class Author(models.Model):
.... ....
class Wife(models.Model):
.... ....
# 增加对Author的一对一引用
author = models.OneToOneField(Author)
# 在数据库中,生成一个外键(author_id)列在 wife 表中,要引用自 author 表中的主键
# 在 Author 的实体中,增加一个隐式属性叫 wife
查询
# 正向查询:直接通过关联属性查询即可
# 通过 wife 找 author
wife = Wife.objects.get(id=1)
author = wife.author
# 反向查询:通过反向引用属性查询
# 通过 author 找 wife
author = Author.objects.get(id=1)
wife = author.wife
一对多映射
语法
# 在"多"实体中增加对"一"实体的引用
属性 = models.ForeignKey(Entry)
class Publisher(models.Model):
.... ....
class Book(models.Model):
.... ....
publisher = models.ForeignKey(Publisher)
查询
# 正向查询
# 通过Book查询Publisher
book = Book.objects.get(id=1)
publisher = book.publisher
# Django默认会在Publisher中增加book_set属性,来表示对应的所有书籍的查询对象
pub = Publisher.objects.get(id=1)
books = pub.book_set.all()
多对多映射
语法
# 在关联的两个类的任意一个类中
属性 = models.ManyToManyField(Entry)
class Author(models.Model):
.... ....
class Book(models.Model):
.... ....
authors = models.ManyToManyField(Author)
查询
# 正向查询
# 通过 Book 查询 Author
# authors 属性只是提供了对关联表的一个查询引用
# 使用all(),values()等方法获取最终数据
book = Book.objects.get(id=1)
authors = book.authors.all()
# 反向查询
author = Author.objects.get(id=1)
books = author.book_set.all()
自定义查询对象
# 声明类 EntryManager 继承自 models.Manager
# 允许在 EntryManager 中添加自定义函数
class EntryManager(models.Manager):
def 函数名(self,自定义参数列表):
... ...
return ... ...
# 使用 EntryManager 覆盖 Models类中原有的 objects
class Entry(models.Model):
objects = EntryManager()
name = models.CharField(xxxx)
网友评论