模型层
与数据库相关的,用于定义数据模型和数据库表结构。 在Django应用程序中,模型层是数据库和应用程序之间的接口,它负责处理所有与数据库相关的操作,例如创建、读取、更新和删除记录。Django的模型层还提供了一些高级功能
首先准备工作:切换mysql数据库
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代码必须写在测试脚本下面
把测试脚本放进一个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
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
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查看
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 去重
res = models.Userinfo.objects.all().values('password').distinct()
print(res)
order_by 排序
res1 = models.Userinfo.objects.all().order_by('username') # <QuerySet [<Userinfo: Userinfo object (2)>, <Userinfo: Userinfo object (1)>, <Userinfo: Userinfo object (3)>]
print(res1)
"""默认升序"""
基于双下划线的查询
查询年龄大于xx
"""查看年龄大于或小于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)