• Django(七、模型层)


    模型层

    模型层前期准备

    使用django ORM要注意

    1.django自带的sqlite3数据可对时间字段不敏感,有时候会展示错乱,所以我们习惯切换成常见的数据库比如MySQL。

    2.django ORM并不会自动帮我们创建数据库,所以我们需要提前准备好‘db001’库

    3.id字段是自动添加的,如果想自定义主键,只需要在其中一个字段中店家primary_key=True,如果django发现你已经明确的设置了Field.primary_key,它将不会自动添加ID列

    4.django支持mysql5.5及更高版本。

    默认不允许单独测试某个py文件,如果想要测试某个py文件,一般是测试models.py文件

    测试环境1:pycharm提供的python console(临时保存,不推荐使用)

    测试环境2:自己搭建(自带的test或者自己创建的py文件)

    1.拷贝manage.py前四行代码
    2.自己再添加两行
    	import django
        django.setup()
    
    • 1
    • 2
    • 3
    • 4

    代码演示:

    tests.py

    # manage.py中拷贝前四行代码
    import os
    import sys
    if __name__=='__main__':  # 需要在__name__下运行
        os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'djangoProject6.settings')# 1.引入django配置文件
        # 手写两行
        import django
        django.setup()  # 2.启动django
    	# 导入app01文件夹内models文件并 测试models文件内User运行
        from app01 import models
        models.User.objects.all()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    models.py

    class Userinfo(models.Model):
        username = models.CharField(max_length=32)
        password = models.CharField(max_length=64)
        age = models.IntegerField(null=True)
        register_time = models.DateTimeField(verbose_name='注册事件', auto_now_add=True)
    
        """
        DateField       : 年月日
        DateTimeField   : 年月日 时分秒
        
        两个重要参数
        auto_now        : 每次操作数据的时候 该字段会自动将当前时间更新 
        auto_now_add    : 在创建数据的时候会自动将当前创建时间记录下来 之后只要不人为的修改 那么就一直不变
        """
    
    	def __str__(self):
            return self.username
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    在这里插入图片描述

    切换MySQL数据库

    1.提前终端创建好库db001
    2.将DATABASES的配置更改
    	DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.mysql',
            'NAME': 'db001',
            'USER':'root',
            'PASSWORD':'123123',
            'HOST':'127.0.0.1',
            'PORT':3306,
            'CHARSET':'utf8'
    
        }
    }
    3.连接MySQL库,数据迁移
    4.makemigrations
    5.migrate
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    如何查看django ORM 底层原理?

    django ORM本质还是SQL语句。

    1.如果有QuerySet对象,那么可以直接点query查看SQL语句

    res2 = models.Userinfo.objects.values_list('id', 'username')
    print(res.query)
    SELECT `app01_userinfo`.`id`, `app01_userinfo`.`username` FROM `app01_userinfo`
    
    • 1
    • 2
    • 3

    结论:有些不是QuerySet对象,就不能通过点query的形式点出来,就只能使用通过的方法

    2.如果想查看所有ORM底层的SQL语句,也可以直接在配置文件添加日志记录

    res1 = models.User.objects.create(name='kimi',age=16)
    print(res.query)  # 会报错
    
    settings最后>>>拷贝代码放在settings
    
    LOGGING = {
        'version': 1,
        'disable_existing_loggers': False,
        'handlers': {
            'console':{
                'level':'DEBUG',
                'class':'logging.StreamHandler',
            },
        },
        'loggers': {
            'django.db.backends': {
                'handlers': ['console'],
                'propagate': True,
                'level':'DEBUG',
            },
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    单表操作

    模型层之ORM常见关键字
    基础的增删改查
    方法返回值
    create(字段名=数据)刚创建的数据记录对象
    filter(筛选条件)QuerySet列表对象
    filter().update(修改内容)受影响的行数
    filter().delete()受影响的行数即各表受影响的行数
    常用的关键字
    create描述
    filter创建数据并直接获取当前创建的数据对象
    first/last根据条件筛选数据 结果是QuerySet [数据对象1,数据对象2]
    update拿queryset里面第一个元素/拿queryset里面最后一个元素
    delete删除数据(批量删除)
    all查询所有数据 结果是QuerySet [数据对象1,数据对象2]
    values根据指定字段获取数据 结果是QuerySet [{}},{},{},{}]
    values_list根据指定字段获取数据 结果是QuerySet [(),(),(),()]
    distinct去重 数据一定要一模一样才可以 如果有主键肯定不行
    order_by根据指定条件排序 默认是升序 字段前面加负号就是降序
    get根据条件筛选数据并直接获取到数据对象 一旦条件不存在会直接报错 不建议使用
    exclude取反操作
    reverse颠倒顺序(被操作的对象必须是已经排过序的才可以)
    count统计结果集中数据的个数
    exists判断结果集中是否含有数据 如果有则返回True 没有则返回False

    常见的十几种查询

    if __name__=='__main__':
        os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'day06_1.settings')  # 1.引入django配置文件
        import django
        django.setup()  # 2.启动django
        from app01 import models
        res = models.Userinfo.objects.filter(pk=1).first()  # 查询id为1的数据
        print(res)
    
        # 查询所有数据,但是只要id和username字段
        res1 = models.Userinfo.objects.values('id', 'username')
        for i in res1:
            print(i['id'],i['username'])
    
        res2 = models.Userinfo.objects.values_list('id', 'username')  # 取出来的对象是列表套元组,可以通过索引取值
        print(res2)  # 
        print(res2[0][1])  # jack
        print(res2.query)  #  SELECT `app01_userinfo`.`id`, `app01_userinfo`.`username` FROM `app01_userinfo`查看底层的SQL语句
    
        res3 = models.Userinfo.objects.all().values('password').distinct()  # distinct 去重
        print(res3)  # 
    
        res4 = models.Userinfo.objects.all().order_by('id')  # order_by 默认按照升序排序,在需要查找的值中加一个-号就是降序,可以添加多个字段排序
        print(res4)
    
        res5 = models.Userinfo.objects.all().order_by('-id').reverse()  # reverse 反转排序,前提是已经排过序了
        print(res5)
    
        res6 = models.Userinfo.objects.filter(password=123).count()  # count 统计当前数据的个数
        print(res6)
    
        res7 = models.Userinfo.objects.exclude(pk=1)  # exclude 查询除了id=1的所有数据
        print(res7)
    
        res8 = models.Userinfo.objects.filter(pk=4).exists()  # exists 查询当前数据是否存在
        print(res8)
    
        res9 = models.Userinfo.objects.create(username='sb',password=123)  # 添加数据
        print(res9)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38

    基于双下滑线的查询

        1 年龄大于35岁的数据
        res = models.User.objects.filter(age__gt=35)
        print(res)
        2 年龄小于35岁的数据
        res = models.User.objects.filter(age__lt=35)
        print(res)
        大于等于 小于等于
        res = models.User.objects.filter(age__gte=32)
        print(res)
        res = models.User.objects.filter(age__lte=32)
        print(res)
    
        年龄是18 或者 32 或者40
        res = models.User.objects.filter(age__in=[18,32,40])
        print(res)
    
        年龄在1840岁之间的  首尾都要
        res = models.User.objects.filter(age__range=[18,40])
        print(res)
    
        查询出名字里面含有s的数据  模糊查询
        res = models.User.objects.filter(name__contains='s')
        print(res)
    
        是否区分大小写  查询出名字里面含有p的数据  区分大小写
        res = models.User.objects.filter(name__contains='p')
        print(res)
        忽略大小写
        res = models.User.objects.filter(name__icontains='p')
        print(res)
    
        res = models.User.objects.filter(name__startswith='j')
        res1 = models.User.objects.filter(name__endswith='j')
    
        print(res,res1)
    
    
        查询出注册时间是 2020 1月
        res = models.User.objects.filter(register_time__month='1')
        res = models.User.objects.filter(register_time__year='2020')
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
  • 相关阅读:
    使用CDN构建读取缓存设计
    python基于GDAL的多线程高速批量重采样、对齐栅格、对齐行列数,并无损压缩
    基于STM32结合CubeMX学习Free-RT-OS的源码之任务调度
    第一章:Vue核心
    利用IDEA软件 创建springboot项目 整合MyBatis框架
    读书笔记|《数据压缩入门》—— 柯尔特·麦克安利斯 亚历克斯·海奇
    促成交、推复购、提效率……我们是认真的!
    wps、office插入的复选框无法设置字体及大小?教你一招
    异步过渡方案—Generator
    Appian发布最新版本:通过AI流程自动化推动业务发展
  • 原文地址:https://blog.csdn.net/shiyaopeng11/article/details/134429687