# >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
# 创建数据库
create
database
django_demo
default
charset = utf8;
# 定义django中的model模型
from django.db import models
# 定义图书模型类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' # 指明数据库表名
verbose_name = '图书' # 在admin站点中显示的名称
verbose_name_plural = verbose_name # 显示的复数名称
def __str__(self):
"""定义每个数据对象的显示信息"""
return self.btitle
# 定义英雄模型类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
def __str__(self):
return self.hname
python
manage.py
makemigrations
python
manage.py
migrate
# 添加测试数据
insert
into
tb_books(btitle, bpub_date, bread, bcomment, is_delete)
values
('射雕英雄传', '1980-5-1', 12, 34, 0),
('天龙八部', '1986-7-24', 36, 40, 0),
('笑傲江湖', '1995-12-24', 20, 80, 0),
('雪山飞狐', '1987-11-11', 58, 24, 0);
insert
into
tb_heros(hname, hgender, hbook_id, hcomment, is_delete)
values
('郭靖', 1, 1, '降龙十八掌', 0),
('黄蓉', 0, 1, '打狗棍法', 0),
('黄药师', 1, 1, '弹指神通', 0),
('欧阳锋', 1, 1, '蛤蟆功', 0),
('梅超风', 0, 1, '九阴白骨爪', 0),
('乔峰', 1, 2, '降龙十八掌', 0),
('段誉', 1, 2, '六脉神剑', 0),
('虚竹', 1, 2, '天山六阳掌', 0),
('王语嫣', 0, 2, '神仙姐姐', 0),
('令狐冲', 1, 3, '独孤九剑', 0),
('任盈盈', 0, 3, '弹琴', 0),
('岳不群', 1, 3, '华山剑法', 0),
('东方不败', 0, 3, '葵花宝典', 0),
('胡斐', 1, 4, '胡家刀法', 0),
('苗若兰', 0, 4, '黄衣', 0),
('程灵素', 0, 4, '医术', 0),
('袁紫衣', 0, 4, '六合拳', 0);
python
manage.py
shell
from booktest.models import BookInfo, HeroInfo
# 查询标号为1的图书
BookInfo.objects.filter(id__exact=1)
BookInfo.objects.filter(id=1)
BookInfo.objects.get(id=1)
# 模糊查询包含
BookInfo.objects.filter(btitle__contains="传")
# 制定开头和结尾
BookInfo.objects.filter(btitle__endswith='部')
BookInfo.objects.filter(btitle__startswith='雪')
# 查询书名不为空的图书
BookInfo.objects.filter(btitle__isnull=False)
BookInfo.objects.filter(btitle__isnull=True)
# 范围查询
BookInfo.objects.filter(id__in=[1, 3, 5])
# 比较查询
BookInfo.objects.filter(id__gt=3)
BookInfo.objects.filter(id__gte=3)
BookInfo.objects.filter(id__lt=3)
BookInfo.objects.filter(id__lte=3)
# 不等于的运算符号
BookInfo.objects.exclude(id=3)
# 日期的查询
# 查询1980年发表的图书
BookInfo.objects.filter(bpub_date__year=1980)
# 查询1980年1月1日后发表的图书
from datetime import date
BookInfo.objects.filter(bpub_date__gt=date(1990, 1, 1))
# 查询阅读量大于等于评论量的图书
from django.db.models import F
BookInfo.objects.filter(bread__gte=F("bcomment"))
# 查询阅读量大于2倍评论量的图书
BookInfo.objects.filter(bread__gte=F("bcomment") * 2)
# 查询阅读量大于20,并且编号小于3的图书]
BookInfo.objects.filter(bread__gt=20, id__lt=3)
BookInfo.objects.filter(bread__gt=20).filter(id__lt=3)
# 查询阅读量大于20的图书
from django.db.models import Q
BookInfo.objects.filter(Q(bread__gt=20))
# 查询阅读量大于20,或编号小于3的图书,只能使用Q对象实现
BookInfo.objects.filter(Q(bread__gt=20) | Q(id__lt=3))
BookInfo.objects.filter(Q(bread__gt=20) | Q(pk__lt=3))
# Q对象可以使用&、|连接,&表示逻辑与,|表示逻辑或
# Q对象前可以使用~操作符,表示非not。
BookInfo.objects.filter(~Q(pk__lt=3))
# 聚合函数
# 查询图书的总阅读量
# 使用aggregate()过滤器调用聚合函数。
# 聚合函数包括:
# Avg 平均,Count 数量,
# Max 最大,Min 最小,Sum
from django.db.models import Sum
a = BookInfo.objects.aggregate(Sum("bread"))
# 注意aggregate的返回值是一个字典类型,格式如下: {'属性名__聚合类小写':值}
BookInfo.objects.count()
# 排序
BookInfo.objects.all().order_by("bread")
BookInfo.objects.all().order_by("-bread")
# 由图书的id查询到书中的人物的名字
# 一到多
b = BookInfo.objects.get(id=1)
b.heroinfo_set.all()
# 多到一
# 查询到id为1的英雄所在的书的名字
h = HeroInfo.objects.get(id=1)
h.hbook # (涉及到跨表查询)
h.hbook_id # (不涉及到跨相当与取出口的是一个字段的属性)
# 关联过滤
# 查询图书,要求图书英雄为"孙悟空"
# 查询的条件在多模型中,要查询的模型为单模型
BookInfo.objects.filter(heroinfo__hname="郭靖")
# 查询图书,要求图书中英雄的描述包含"八"
BookInfo.objects.filter(heroinfo__hname__contains="郭靖")
# 由一模型类条件查询多模型类条件
# 查询书名为“天龙八部”的所有英雄。
HeroInfo.objects.filter(hbook__btitle="天龙八部")
# 查询图书阅读量大于30的所有英雄
HeroInfo.objects.filter(hbook__bread__gt=30)
# 修改更新有两种方法
hero = HeroInfo.objects.get(hname__contains="郭")
hero.hname = "郭靖001"
hero.save()
# 返回值为受影响的行数
HeroInfo.objects.filter(hname="郭靖001").update(hname="郭靖")
"""
bittle = 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="逻辑删除")
"""
book_add = BookInfo()
book_add.btitle = "三毛流浪记"
book_add.bpub_date = date(1993, 12, 27)
book_add.save()
"""
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="逻辑删除")
"""
from app01.models import BookInfo
book_add = BookInfo()
book_add.btitle = "三毛流浪记2"
book_add.bpub_date = date(1994, 12, 27)
book_add.save()
from app01.models import BookInfo, HeroInfo
hero_add = HeroInfo()
hero_add.hname = "三毛"
hero_add.hgender = 0
hero_add.hbook_id = book_add.objects.get(bittle="三毛流浪记2")
hero_add.save()
HeroInfo.objects.filter(hname__exact="三毛").delete()