004--Django(定义模型类、数据的增删改查、F和Q对象)

1.创建数据库

mysql -uroot -pmysql

create database django_demo charset=utf8;

2.配置mysql数据库


在settings.py 中配置数据库连接信息

# 默认数据库信息
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    }
}

修改为:

# 以自己创建的数据库为准
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'HOST': '127.0.0.1',  # 数据库主机
        'PORT': 3306,  # 数据库端口
        'USER': 'root',  # 数据库用户名
        'PASSWORD': 'mysql',  # 数据库用户密码
        'NAME': 'djangodb'  # 数据库名字
    }
}

修改成功后 ,需要安装MySQL数据库的客户端驱动

安装mysqlclient

pip install mysqlclient

3.ORM框架介绍

O是object,也就是类或者对象的意思,这里的类就是模型类
R是relation,也就是关系数据库中数据表的意思
M是mapping,也就是映射的意思
在ORM框架中,它帮我们把模型类和数据表进行了一个映射,可以让我们通过模型类及对象就能操作它所对应的数据表中的数据
ORM框架它还可以根据我们设计的模型类自动帮我们生成数据库中对应的数据表,省去了我们自己建表的过程

作用和优点:
1.只需要 面向对象编程 , 不需要面向数据库编写代码
2.实现了数据模型与数据库的 解耦 , 屏蔽了不同数据库操作上的差异.

4.定义模型了和数据库迁移

模型类被定义在子应用/models.py文件中
模型类必须继承自Model类,位于django.db.models中
创建子应用booktest,并在其models.py文件中定义模型类
class BookInfo(models.Model):
    # 创建字段,字段类型...
    btitle = models.CharField(max_length=20, verbose_name='名称')
    bpub_date = models.DateField(verbose_name='发布日期', null=True)
    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 = 'bookinfo'  # 指明数据库表名
        verbose_name = '书'  # 在admin站点中显示的名称

    def __str__(self):
        """定义每个数据对象的显示信息"""
        return self.btitle


class HeroInfo(models.Model):
    GENDER_CHOISE = (
        (0, 'male'),
        (1, 'female')
    )
    hname = models.CharField(max_length=20, verbose_name="名字")
    hgender = models.SmallIntegerField(choices=GENDER_CHOISE, verbose_name="性别")
    hdesc = 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 = 'heroinfo'
        verbose_name = '英雄'

    def __str__(self):
        return self.hname

在这里插入图片描述
在这里插入图片描述

了解:关于外键

在设置外键时,需要通过on_delete选项指明主表删除数据时,对于外键引用表数据如何处理,在django.db.models中包含了可选常量:

CASCADE 级联,删除主表数据时连通一起删除外键表中数据

PROTECT 保护,通过抛出ProtectedError异常,来阻止删除主表中被外键应用的数据

SET_NULL 设置为NULL,仅在该字段null=True允许为null时可用

SET_DEFAULT 设置为默认值,仅在该字段设置了默认值时可用

SET() 设置为特定值或者调用特定方法

DO_NOTHING 不做任何操作,如果数据库前置指明级联性,此选项会抛出IntegrityError异常

5.迁移模型类

# 生成迁移文件

python manage.py makemigrations
#同步到数据库中

python manage.py migrate

插入数据测试

insert into bookinfo(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 heroinfo(hname, hgender, hbook_id, hdesc, 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);

6.增删改查

ps:交互测试代码可以在这
在这里插入图片描述

6.1 新增

增加数据有两种方式
1.save()
2.create()

使用前要进行导包


from book_test.models import BookInfo,HeroInfo

方式一:save


book =BookInfo()
book.btitle ='西游记'
book.bpub_date='2020-02-02'
book.bread=20
book.bcomment=30
book.save()

方式二:create

BookInfo.object.create(

	btitle='三国',
	bpub_date='2020-01-01',
	bread=100,
	bcomment=200	
)

6.2 修改

修改数据有两种方式
1.save()
2.update

from book_test.models import BookInfo,HeroInfo

方式一:save

#把叫猪八戒的英雄改为猪悟能
hero =HeroInfo.objects.get(hname='猪八戒')
hero.hname='猪悟能'
hero.save()

方式二:update

#把叫沙悟净的英雄改为沙僧
HerInfo.objects.filter(hname='沙悟净').update(hname='沙僧')

6.3删除

删除数据有两种方式
1.模型类对象delete
2.模型类.objects.filter().delete()

方式一:

#删除id为1的英雄
hero=HeroInfo.objects.get(id=1)
hero.delete()

方式二:

#删除id为2的英雄
HeroInfo.objects.filter(id=2).delete()

6.4 查询

1.基本查询
2.过滤查询
3.模糊查询
4.空查询
5.范围查询
6.比较查询
7.日期查询

基本查询:
get 查询单一结果,如果不存在会抛出DoesNotExist异常,如果存在多个结果会报MultipleObjectsReturned异常

all 查询多个结果。

count 查询结果数量
# 查询所有书
BookInfo.objects.all()

#查询id为1的书
BookInfo.objects.get(id=3)
 
 #查询书的总数
BookInfo.objects.count()

过滤查询:
filter 过滤出满足条件的多个结果

exclude 排除掉符合条件剩下的结果( 取反 )

语法:
属性名称__比较运算符=值
# 查询编号为1的图书
BookInfo.objects.filter(id=1)

#查询除了编号为1之外的图书
BookInfo.objects.exclude(id=1)

模糊查询:
contains:是否包含
startswith、endswith:以指定值开头或结尾
# 查询书名包含'传'的图书
BookInfo.objects.filter(btitle__contains='传')

#查询书名以'部'结尾的图书
BookInfo.objects.filter(btitle__endswith='部')

以上运算符都区分大小写,在这些运算符前加上i表示不区分大小写,如iexact、icontains、istartswith、iendswith.


空查询:
isnull:是否为null
#查询书名不为空的图书
BookInfo.object.filter(btitle__isnull=False)

范围查询:
in:是否包含在范围内
#查询编号为1或3或5的图书
BookInfo.object.filter(id__in=[1,3,5])

比较查询:
gt 大于 

gte 大于等于

lt 小于

lte 小于等于
#查询编号大于3的图书
BookInfo.objects.filter(id__gt=3)

日期查询:
year、month、day、week_day、hour、minute、second:对日期时间类型的属性进行运算。
# 查询1980年发表的图书
BookInfo.objects.filter(bpub_date__year=1980)

#查询1980年1月1日后发表的图书。
BookInfo.objects.filter(bpub_date__gt=date(1990,1,1))

7.F和Q对象使用

F对象
F对象 两个属性进行比较
F(属性名)
使用时需要进行导包
from django.db.models import F,Q

#查询阅读量大于等于评论量的图书
BookInfo.objects.filter(bread__gte=F('bcomment'))

#查询阅读量大于2倍评论量的图书
BookInfo.objects.filter(bread_gt=F('bcomment')*2)

Q对象
Q对象 多个过滤器逐个调用表示逻辑与关系
实现 not and or
not  ~
and &
or |
Q(属性名__运算符=值)
#查询阅读量大于20,并且编号小于3的图书
BookInfo.objects.filter(bread__gt=20,id__lt=3)
或
BookInfo.objects.filter(bread__gt=20).filter(id__lt=3)
使用时需要进行导包
from django.db.models import F,Q
#查询阅读量大于20,或编号小于3的图书
BookInfo.object.filter(Q(bread_gt=20) | Q(id__it=3))

Q对象前可以使用~操作符,表示非not。

#查询编号不等于3的图书
BookInfo.object.filter(~Q(id=3))
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值