定義圖書模型類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='天龍八部')