文章目录
- 模型层
- 模型层前期准备
- 使用django ORM要注意
- 代码演示:
- 切换MySQL数据库
- 如何查看django ORM 底层原理?
- 单表操作
- 模型层之ORM常见关键字
- 基础的增删改查
- 常用的关键字
- 常见的十几种查询
- 基于双下滑线的查询
模型层
模型层前期准备
使用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()
代码演示:
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()
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
切换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
如何查看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`
结论:有些不是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',
},
}
}
单表操作
模型层之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) # <QuerySet [(1, 'jack'), (2, 'jerry'), (3, 'tank')]>
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) # <QuerySet [{'password': '123'}, {'password': '222'}]>
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 年龄大于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)
年龄在18到40岁之间的 首尾都要
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')