给别人做网站能赚钱吗,上海房地产网站建设报价,做网站是用什么软件做的,建设自己的企业网站需要什么文章目录 模型层模型层前期准备使用django ORM要注意 代码演示#xff1a;切换MySQL数据库如何查看django ORM 底层原理#xff1f; 单表操作模型层之ORM常见关键字基础的增删改查常用的关键字 常见的十几种查询基于双下滑线的查询 模型层
模型层前期准备
使用django ORM要… 文章目录 模型层模型层前期准备使用django ORM要注意 代码演示切换MySQL数据库如何查看django ORM 底层原理 单表操作模型层之ORM常见关键字基础的增删改查常用的关键字 常见的十几种查询基于双下滑线的查询 模型层
模型层前期准备
使用django ORM要注意
1.django自带的sqlite3数据可对时间字段不敏感有时候会展示错乱所以我们习惯切换成常见的数据库比如MySQL。
2.django ORM并不会自动帮我们创建数据库所以我们需要提前准备好‘db001’库
3.id字段是自动添加的如果想自定义主键只需要在其中一个字段中店家primary_keyTrue,如果django发现你已经明确的设置了Field.primary_key,它将不会自动添加ID列
4.django支持mysql5.5及更高版本。
默认不允许单独测试某个py文件如果想要测试某个py文件一般是测试models.py文件
测试环境1pycharm提供的python console临时保存不推荐使用
测试环境2自己搭建自带的test或者自己创建的py文件
1.拷贝manage.py前四行代码
2.自己再添加两行import djangodjango.setup()代码演示
tests.py
# manage.py中拷贝前四行代码
import os
import sys
if __name____main__: # 需要在__name__下运行os.environ.setdefault(DJANGO_SETTINGS_MODULE, djangoProject6.settings)# 1.引入django配置文件# 手写两行import djangodjango.setup() # 2.启动django# 导入app01文件夹内models文件并 测试models文件内User运行from app01 import modelsmodels.User.objects.all()models.py
class Userinfo(models.Model):username models.CharField(max_length32)password models.CharField(max_length64)age models.IntegerField(nullTrue)register_time models.DateTimeField(verbose_name注册事件, auto_now_addTrue)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(namekimi,age16)
print(res.query) # 会报错settings最后拷贝代码放在settingsLOGGING {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 djangodjango.setup() # 2.启动djangofrom app01 import modelsres models.Userinfo.objects.filter(pk1).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]) # jackprint(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(password123).count() # count 统计当前数据的个数print(res6)res7 models.Userinfo.objects.exclude(pk1) # exclude 查询除了id1的所有数据print(res7)res8 models.Userinfo.objects.filter(pk4).exists() # exists 查询当前数据是否存在print(res8)res9 models.Userinfo.objects.create(usernamesb,password123) # 添加数据print(res9)基于双下滑线的查询 1 年龄大于35岁的数据res models.User.objects.filter(age__gt35)print(res)2 年龄小于35岁的数据res models.User.objects.filter(age__lt35)print(res)大于等于 小于等于res models.User.objects.filter(age__gte32)print(res)res models.User.objects.filter(age__lte32)print(res)年龄是18 或者 32 或者40res 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__containss)print(res)是否区分大小写 查询出名字里面含有p的数据 区分大小写res models.User.objects.filter(name__containsp)print(res)忽略大小写res models.User.objects.filter(name__icontainsp)print(res)res models.User.objects.filter(name__startswithj)res1 models.User.objects.filter(name__endswithj)print(res,res1)查询出注册时间是 2020 1月res models.User.objects.filter(register_time__month1)res models.User.objects.filter(register_time__year2020)