定义图书模型类BookInfo
class BookInfo(models.Model):
btitle = models.CharField(max_length=20, verbose_name='名称')
bpub_date = models.DateField(verbose_name='发布日期')
bread = models.IntegerField(default=0, verbose_name='阅读量')
bcomment = models.IntegerField(default=0, verbose_name='评论量')
is_delete = models.BooleanField(default=False, verbose_name='逻辑删除')
class Meta:
db_table = 'tb_books' # h指明数据库表名
verbose_name = '图书' # 在admin站点中显示的名称
verbose_name_plural = verbose_name # 显示的复数名称
定义英雄模型类HeroInfo
class HeroInfo(models.Model):
GENDER_CHOICES = (
(0, 'male'),
(1, 'female')
)
hname = models.CharField(max_length=20, verbose_name='名称')
hgender = models.SmallIntegerField(choices=GENDER_CHOICES, default=0, verbose_name='性别')
hcomment = models.CharField(max_length=200, null=True, verbose_name='描述信息')
hbook = models.ForeignKey(BookInfo, on_delete=models.CASCADE, verbose_name='图书') # 外键
is_delete = models.BooleanField(default=False, verbose_name='逻辑删除')
class Meta:
db_table = 'tb_heros'
verbose_name = '英雄'
verbose_name_plural = verbose_name
# 基本条件查询
# 1.查询id为1的书籍
BookInfo.objects.filter(id=1)
# 2.查询书名包含‘湖’的书籍 (like %湖%)
BookInfo.objects.filter(btitle__contains='湖')
# 3.查询书名以‘部’结尾的书籍 (endswith 、startswith)(like %部)
BookInfo.objects.filter(btitle__endswith='部')
# 4.查询书名不为空的书籍 (双重否定代表肯定)BookInfo.objects.filter(btitle__isnull=False)
# 5.查询编号为2或4的书籍 (选项,要么2要么4) (不是区间)
BookInfo.objects.filter(id__in=[2,4])
# 6.查询编号大于2的书籍 (大于:gt)(小于:lt)(大于等于:gte)(小于等于:lte)
BookInfo.objects.filter(id__gt=2)
# 7.查询id不等于3的书籍 (exclude查询满足条件以外的数据) (filter查询满足条件的数据)
BookInfo.objects.exclude(id=3)
# 8.查询1980年发表的书籍BookInfo.objects.filter(bpub_date__year='1980')
# 9.查询1990年1月1日后发表的书籍
BookInfo.objects.filter(bpub_date__gt=date(1990,1,1))
# 10.按照阅读量进行排序查询
正序(从小到大):
BookInfo.objects.all().order_by('bread')
倒序:
BookInfo.objects.all().order_by('-bread')
########################################################
# F对象
# 1.查询阅读量大于评论量的书籍
BookInfo.objects.filter(bread__gt=F('bcomment'))
# 2.查询阅读量大于2倍评论量的书籍
BookInfo.objects.filter(bread__gt=F('bcomment')*2)
########################################################
# Q对象
# 1.查询阅读量大于20,或编号小于3的图书
BookInfo.objects.filter(Q(bread__gt=20) | Q(id__lt=3))
# 2.查询编号不等于3的书籍
BookInfo.objects.filter(~Q(id=3))
########################################################
# 聚合函数
# 1.统计总的阅读量
BookInfo.objects.aggregate(Sum('bread'))
########################################################
# 基础关联查询
# 1.一查多:查询编号为1的图书中所有人物信息
book = BookInfo.objects.get(id=1)
book.heroinfo_set.all()
# 2.多查一:查询编号为1的英雄出自的书籍
hero = HeroInfo.objects.get(id=1)
hero.hbook
########################################################
# 关联过滤查询
# 1.多查一:查询书籍中人物的描述包含"降龙"的书籍
BookInfo.objects.filter(heroinfo__hcomment__contains='降龙')
# 2.一查多:查询书名为"天龙八部"的所有人物信息
HeroInfo.objects.filter(hbook__btitle='天龙八部')