django中数据库操作有关部分

# >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
# 创建数据库
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()

转载于:https://www.cnblogs.com/cerofang/p/9307681.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值