目录
模型层
模型层前期准备
使用django ORM要注意
1、django自带的sqlite3数据可对时间字段不敏感,有时候会展示错乱,所以我们习惯切换成常见的数据库比如MySQL。
2、django ORM并不会自动帮我们创建库,所以需要提前准备好''djangoday01''
3.id字段是自动添加的,如果想自定义主键,只需要在其中一个字段指定primary_key = True,如果Django发现你已经明确地设置了Field.primary_key,它将不会添加自动ID列。
- Django支持MySQL5.5及更高版本。
django测试某个功能层
默认不允许单独测试某个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
def main():
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'djangoProject6.settings')
# 手写两行
import django
django.setup()
# 导入app01文件夹内models文件并 测试models文件内User运行
from app01 import models
models.User.objects.all()
models.py
class User(models.Model):
name = models.CharField(max_length=32, verbose_name='用户名')
age = models.IntegerField(verbose_name='年龄')
register_time = models.DateTimeField(verbose_name='注册事件', auto_now_add=True)
"""
DateField : 年月日
DateTimeField : 年月日 时分秒
两个重要参数
auto_now : 每次操作数据的时候 该字段会自动将当前时间更新
auto_now_add : 在创建数据的时候会自动将当前创建时间记录下来 之后只要不人为的修改 那么就一直不变
"""
def __str__(self):
return '用户对象:%s' % self.name
切换MySQL数据库
1.提前终端创建好库djangoday01
2.将DATABASES的配置更改
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'djangoday01',
'USER':'root',
'PASSWORD':'123',
'HOST':'127.0.0.1',
'PORT':3306,
'CHARSET':'utf8'
}
}
3.连接MySQL库
4.makemigrations
5.migrate
如何查看django ORM 底层原理?
django ORM本质还是SQL语句。
1.如果有QuerySet对象,那么可以直接点query查看SQL语句
res =models.User.objects.filter(name='kimi')
print(res.query)
SELECT `app01_user`.`id`, `app01_user`.`name`, `app01_user`.`age`, `app01_user`.`register_time` FROM `app01_user` WHERE `app01_user`.`name` = kimi
结论:有些不是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 | 创建数据并直接获取当前创建的数据对象 |
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 |
1.create 创建数据并直接获取当前创建的数据对象
res1 = models.User.objects.create(name='kimi',age=16)
print(res1)
res2 = models.User.objects.create(name='rose', age=18)
print(res2)
res3 = models.User.objects.create(name='jason', age=20)
print(res3)
res4 = models.User.objects.create(name='kiki', age=27)
print(res4)
2.filter() 根据条件筛选数据 结果是QuerySet [数据对象1,数据对象2]
res5 =models.User.objects.filter()
res6 =models.User.objects.filter(name='kimi')
res7 =models.User.objects.filter(name='kimi',age=16 )
print(res5)
print(res6) # <QuerySet [<User: 用户对象:kimi>, <User: 用户对象:kimi>, <User: 用户对象:kimi>, <User: 用户对象:kimi>]>
print(res7) # <QuerySet [<User: 用户对象:kimi>, <User: 用户对象:kimi>, <User: 用户对象:kimi>, <User: 用户对象:kimi>]>
3.first()/last() QuerySet支持索引取值但是只支持正数 并且orm不建议你使用索引
res8 =models.User.objects.filter()[1]
# res9=models.User.objects.filter(pk=100)[0] # 数据不存在索引取值会报错
res10 =models.User.objects.filter(pk=100).first() # 数据不存在不会报错而是返回None
res11 =models.User.objects.filter(pk=100).last() # 数据不存在不会报错而是返回None
print(res8) # 用户对象:kimi
# print(res9)
print(res10) # None
print(res11) # None
4.update() 更新数据(批量更新)
models.User.objects.filter().update() # 批量更新
models.User.objects.filter(id=1).update(9) # 单个删除
5.delete() 删除数据(批量删除)
models.User.objects.filter().delete() 批量删除
models.User.objects.filter(id=1).delete() 单个删除
6.all() 查询所有数据 结果是QuerySet [数据对象1,数据对象2]
res = models.User.objects.all()
7.values() 根据指定字段获取数据 结果是QuerySet [{}},{},{},{}]
values()res=models.User.objects.all().values('name') #结果是QuerySet [{'name': 'kimi'}},{'name': 'rose'},{},{}]
res=models.User.objects.filter().values() #结果是QuerySet [[{'id': 2, 'name': 'kimi', 'age': 16,.....}]
res=models.User.objects.values() # <QuerySet [{'id': 2, 'name': 'kimi', 'age': 16,
8.values_list() 根据指定字段获取数据 结果是QuerySet [(),(),(),()]
res=models.User.objects.all().values_list('name','age') # <QuerySet [('kimi', 16), ('rose', 18), ('jason', 20), ('kiki', 27),...]
9.distinct() 去重 数据一定要一模一样才可以 如果有主键肯定不行
res = models.User.objects.values('name','age').distinct()
10.order_by() 根据指定条件排序 默认是升序 字段前面加负号就是降序
res = models.User.objects.all().order_by('age')
11.get() 根据条件筛选数据并直接获取到数据对象 一旦条件不存在会直接报错 不建议使用
res = models.User.objects.get(pk=1)
print(res) # 用户对象:kimi
#res = models.User.objects.get(pk=100, name='kimi')
# print(res) # 报错
12.exclude() 取反操作
res = models.User.objects.exclude(pk=2)
print(res) #<QuerySet [<User: 用户对象:rose>, <User: 用户对象:jason>, <User: 用户对象:kiki>]>
13.reverse() 颠倒顺序(被操作的对象必须是已经排过序的才可以)
# res = models.User.objects.all()
res = models.User.objects.all().order_by('age') # 升序
res1 = models.User.objects.all().order_by('age').reverse() # 返回升序之前
print(res, res1)
14.count() 统计结果集中数据的个数
res1 =models.User.objects.all().count()
print(res1) # 4
15.exists() 判断结果集中是否含有数据 如果有则返回True 没有则返回False
# res=models.User.objects.all().exisrt() 报错
res1 = models.User.objects.filter(pk=100).exists()
print(res1) # False
方法总结
1、返回QuerySet对象的方法有
all()
filter()
exclude()
order_by()
reverse()
distinct()
2.特殊的QuerySet
values() # 返回一个可迭代的字典序列
values_list() # 返回一个可迭代的元组序列
3.返回具体对象的
get()
first()
last()
4.返回布尔值的方法有
exists()
5.返回数字的方法有count()
count()
标签:name,models,res,模型,django,objects,User,print
From: https://www.cnblogs.com/zhanglanhua/p/16983764.html