一、通过模型类实现关联查询
例1:查询图书信息,要求图书关联的英雄的描述包含‘八’。
BookInfo.objects.filter(heroinfo__hcomment__contains=‘八’)
例2:查询图书信息,要求图书中的英雄的id大于3。
BookInfo.objects.filter(heroinfo__id__gt=3)
例3:查询书名为“天龙八部”的所有英雄。
HeroInfo.objects.filter(hbook__btitle=‘天龙八部’)
总结:通过模型类实现关联查询时,要查哪个表中的数据,就需要通过哪个类来查,写关联查询条件时,如果类中没有关系属性,条件需要写对应类的名称小写,如果类中有关系属性,直接写关系属性。
二、模型的插入和删除
调用一个模型对象的save方法的时候就可以实现对模型类对应数据表的插入和更新。
调用一个模型对象的delete方法的时候就可以实现对模型类对应数据表的删除。
三、自关联
自关联是一种特殊的一对多的关系。
四、管理器
BookInfo.objects.all()中的objects是Django帮我自动生成的管理器对象,通过这个管理器可以实现对数据的查询。
如何自定义管理器呢?
一旦在模型类中定义了管理类对象,将不再使用Django提供的管理器,例如:book = models.Manager()
此时使用终端查询命令为BookInfo.book.all()
如果我们要自定义管理器,需要创建一个模型管理器类继承Manager()。
自定义管理器类的应用场景:
1)改变查询的结果集
比如调用BookInfo.books.all()返回的是没有删除的图书的数据
2)添加额外的方法,操作后台数据表
使用self.model可以获取到self所在模型类的类名。
自定义管理器代码如下:
from django.db import models
# Create your models here.
class BookInfoManager(models.Manager):
'''图书模型管理器类'''
# 1.改变查询结果集
def all(self):
# 1.调用父类的all,获取所有数据
books = super().all() # QuerySet
# 2.对数据进行过滤
books = books.filter(isDelete=False)
# 3.返回books
return books
# 2.封装函数:操作模型类对应的数据表(增删改查)
def create_book(self, btitle, bpub_date):
# 1.创建一个图书对象
# 获取self所在的模型类
model_class = self.model
book = model_class()
# book = BookInfo()
book.btitle = btitle
book.bpub_date = bpub_date
# 2.保存进数据库
book.save()
# 3.返回book
return book
# 一类
class BookInfo(models.Model):
'''图书模型类'''
# 图书名称
btitle = models.CharField(max_length=20)
# 出版日期
bpub_date = models.DateField()
# 阅读量
bread = models.IntegerField(default=0)
# 评论量
bcomment = models.IntegerField(default=0)
# 删除标记
isDelete = models.BooleanField(default=False)
# book = models.Manager() # 自定义一个Manager类对象
objects = BookInfoManager() # 自定义一个BookInfoManager类对象
通过模型类中自定义的管理类,就可以通过BookInfo.objects.create_book(‘三国演义’,‘2020-05-01’)对数据值进行插入数据库,其实在Django默认的管理器中也有个create方法,但需要对关键字参数传值,才能保存数据到数据库,比如BookInfo.objects.create(btitle=‘三国演义’,bpub_date=‘2020-05-01’)
五、元选项
应用场景,我们在做项目迁移的时候,因为原来的数据库表名已生成,但是原来生成的表名依赖于项目名称,一旦项目名称改变了但数据库表名没有改变,就会出现找不到的情况。
为了使模型类应用的表名不依赖于应用的名字,就需要用到元选项。
使用方法:在模型中定义一个元类Meta,在里面定义一个属性db_table就可以指定表名,重新执行迁移后,会看到后台数据表名称变了,数据不会丢失。
# 一类
class BookInfo(models.Model):
'''图书模型类'''
# 图书名称
btitle = models.CharField(max_length=20)
# 出版日期
bpub_date = models.DateField()
# 阅读量
bread = models.IntegerField(default=0)
# 评论量
bcomment = models.IntegerField(default=0)
# 删除标记
isDelete = models.BooleanField(default=False)
# book = models.Manager() # 自定义一个Manager类对象
objects = BookInfoManager() # 自定义一个BookInfoManager类对象
class Meta():
db_table='bookinfo'