Django模型层

模型层

与数据库相关的,用于定义数据模型和数据库表结构。 在Django应用程序中,模型层是数据库和应用程序之间的接口,它负责处理所有与数据库相关的操作,例如创建、读取、更新和删除记录。Django的模型层还提供了一些高级功能

首先准备工作:切换mysql数据库

python 复制代码
DATABASES = {
    'default': {
        # 'ENGINE': 'django.db.backends.sqlite3',
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'db2',
        'USER': 'root',
        'PASSWORD': '12345',
        'HOST': '127.0.0.1',
        'PORT': 3306,
        'CHARSET': 'utf8'
    }

测试脚本

接下来我们可以使用测试脚本来直接运行,注意后面的Django代码必须写在测试脚本下面

python 复制代码
把测试脚本放进一个py文件即可
import os
import sys
import django
if __name__ == "__main__":
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "项目名称.settings")
    import django
    django.setup()

    django.setup()

from app01 import models

常用的关键字

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

示例

如果使用get,建议加上try

python 复制代码
if __name__ == "__main__":
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "djangoProject.settings")
    import django
    django.setup()
    from app01 import models

  try:
        res = models.Userinfo.objects.filter(pk=1).get()
    except Exception as f:
        print(f)

value与value_list

python 复制代码
res = models.Userinfo.objects.values('id', 'username', 'password')
    for i in res:
        print(i.get('id'))    # <QuerySet [{'id': 1, 'username': 'kk', 'password': '1234'}, {'id': 2, 'username': 'cc', 'password': '232'}, {'id': 3, 'username': 'rer', 'password': '323'}]>
        # 1 2 3 索引0为id,1为username
    print(res)   # <QuerySet [(1, 'kk', '1234'), (2, 'cc', '232'), (3, 'rer', '323')]>

查看内部sql语句

只有返回的结果是queryset对时才能用query查看

python 复制代码
res = models.Userinfo.objects.values('id', 'username', 'password')
    for i in res:
        print(i.get('id')) 

print(res.query)
    """SELECT `app01_userinfo`.`id`, `app01_userinfo`.`username`, `app01_userinfo`.`password` FROM `app01_userinfo`"""

distinct 去重

python 复制代码
 res = models.Userinfo.objects.all().values('password').distinct()

    print(res)

order_by 排序

python 复制代码
    res1 = models.Userinfo.objects.all().order_by('username')    # <QuerySet [<Userinfo: Userinfo object (2)>, <Userinfo: Userinfo object (1)>, <Userinfo: Userinfo object (3)>]
    print(res1)
"""默认升序"""

基于双下划线的查询

查询年龄大于xx

python 复制代码
"""查看年龄大于或小于32的数据"""
    res = models.Userinfo.objects.filter(age__gt=32)\(age__lt=32)
    print(res)

"""查看大于等于或小于等于32的数据"""
    res = models.Userinfo.objects.filter(age__gte=32)\(age__lte=32)
    print(res)

"""查看18-32之间的数据,收尾都要"""
    res = models.Userinfo.objects.filter(age__range=[18, 32])
    print(res)

"""查看带s字段的数据"""
    res = models.Userinfo.objects.filter(username__contains='s')
    print(res) # <QuerySet [<Userinfo: Userinfo object (2)>]>

"""姓名以c开头或结尾startwith\endwith"""
    res = models.Userinfo.objects.filter(username__startswith='c')
    print(res)

    """查看注册时间
    两个参数
    auto_now = false 当我们更新数据时,只要更新就会更新时间
    auto_add = False 当auto_add=True时,添加数据时会自动添加当前时间
    
    
    """
    register_time = models.DateTimeField(auto_now=True, auto_now_add=True)
相关推荐
wuqingshun3141591 小时前
MYSQL默认的事务隔离级别是什么?为什么选择这个级别?
数据库·mysql
空中湖1 小时前
电池简史(五):极限之梦与终章——锂硫、锂空气、量子电池,以及你该知道的电池投资与生活指南
数据库·程序人生
蓝胖子酱2 小时前
在 Electron 中用 electron-store 实现加密存储与自定义格式文件
前端·javascript·数据库
snow@li3 小时前
Redis:数据库语法速查表 / 全景梳理
数据库·redis·缓存
Devlive 开源社区3 小时前
Nebula 1.6.0 发布:跨区域桶自动路由、秒传、文本/PDF 预览一次到位
数据库·sql
这个DBA有点耶4 小时前
导个数据中文全变问号?字符集这事儿真没那么简单
数据库·mysql·代码规范
wuqingshun3141594 小时前
MYSQL中如果发生死锁应该如何解决?
数据库·mysql
DO_Community4 小时前
Weaviate 托管数据库现已在 DigitalOcean 上开放公测
数据库·人工智能·开源·向量数据库·weaviate
报错小能手5 小时前
索引常见面试题
数据库
Database_Cool_5 小时前
时序数据库选型:阿里云 Lindorm 时序引擎 vs InfluxDB 全维度对比
数据库·阿里云·时序数据库