ORM表表
ORM表和表之间的关系 一对多 --> 外键(ForeignKey) 多对多 --> 另外一张关系表(ManyToManyField) 三种方式 1.自己建立第三张关系表,外键分别关联两个表 优点 可以扩充第三张关系标的字段 缺点 自己做连表查询 2.通过ORM内置的ManyToManyField,自动常见第三张关系表 优点 提供了很多连表操作的快捷方法--> all(), add(), set(), clear(), remove() 缺点 无法扩展第三张关系表 3.自己创建第三张关系表,通过ManyToManyField关联 优点: 既能够使用多对多查询的快捷方法all(),还能够自己扩展第三张关系表的字段 以后该用哪种? 当第三张关系表中不需要其他额外字段的时候,我们就用默认ManyToManyField就可以了 当第三张关系表中需要额外的字段时,我们就要用第三种方式,自己建立第三张关系表并且用ManyToManyField关联 一对一 --> OneToOneField 当一张表里的字段非常多,并且某几个字段的查询频率远远大于其他字段的时候 把常用字段单独拆成一张表,查询的时候更快捷!
# 方式一:自行创建第三张表 class Book(models.Model): title = models.CharField(max_length=32, verbose_name="书名") class Author(models.Model): name = models.CharField(max_length=32, verbose_name="作者姓名") # 自己创建第三张表,分别通过外键关联书和作者 class Author2Book(models.Model): author = models.ForeignKey(to="Author") book = models.ForeignKey(to="Book") class Meta: unique_together = ("author", "book") # 方式二:通过ManyToManyField自动创建第三张表 class Book(models.Model): title = models.CharField(max_length=32, verbose_name="书名") # 通过ORM自带的ManyToManyField自动创建第三张表 class Author(models.Model): name = models.CharField(max_length=32, verbose_name="作者姓名") books = models.ManyToManyField(to="Book", related_name="authors") # 方式三:设置ManyTomanyField并指定自行创建的第三张表 class Book(models.Model): title = models.CharField(max_length=32, verbose_name="书名") # 自己创建第三张表,并通过ManyToManyField指定关联 class Author(models.Model): name = models.CharField(max_length=32, verbose_name="作者姓名") books = models.ManyToManyField(to="Book", through="Author2Book", through_fields=("author", "book")) # through_fields接受一个2元组('field1','field2'): # 其中field1是定义ManyToManyField的模型外键的名(author),field2是关联目标模型(book)的外键名。 class Author2Book(models.Model): author = models.ForeignKey(to="Author") book = models.ForeignKey(to="Book") class Meta: unique_together = ("author", "book")
ORM关联查询 1. 基于对象的查询 1. 正向查 对象.关联字段 2. 反向查 1. 默认不设置related_name属性 1. 查找的对象是多个的时候(一对多或多对多时) publisher_obj.book_set.all() 2. 查找的对象时一个的时候(一对一) author_info_obj.author.name 2. 设置related_name='books'属性 publisher_obj.books.all() 2. 基于QuerySet的查询 1. 正向查 Book.objects.filter(id=1).values_list('publisher__name') 2. 反向查 1. 默认不设置related_name属性,默认就用类名的小写 Publisher.objects.filter(id=1).values_list('book__price') 2. 设置related_name='books'属性 Publisher.objects.filter(id=1).values_list('books__price')
清风深知杨柳意,啤酒龙虾难相聚。

浙公网安备 33010602011771号