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)
相关推荐
百***920216 小时前
【MySQL】MySQL库的操作
android·数据库·mysql
q***766616 小时前
Spring Boot 从 2.7.x 升级到 3.3注意事项
数据库·hive·spring boot
信仰_27399324317 小时前
Redis红锁
数据库·redis·缓存
人间打气筒(Ada)17 小时前
Centos7 搭建hadoop2.7.2、hbase伪分布式集群
数据库·分布式·hbase
心灵宝贝17 小时前
如何在 Mac 上安装 MySQL 8.0.20.dmg(从下载到使用全流程)
数据库·mysql·macos
奋斗的牛马18 小时前
OFDM理解
网络·数据库·单片机·嵌入式硬件·fpga开发·信息与通信
忧郁的橙子.19 小时前
一、Rabbit MQ 初级
服务器·网络·数据库
杰杰79819 小时前
SQL 实战:用户访问 → 下单 → 支付全流程转化率分析
数据库·sql
爬山算法19 小时前
Redis(120)Redis的常见错误如何处理?
数据库·redis·缓存
野生技术架构师19 小时前
盘一盘Redis的底层数据结构
数据结构·数据库·redis