day64 django模型层
一、单表操作(增删改)
tips:django自带的sqlite3数据库对日期格式不是很敏感,处理的时候容易出错
tips:如果想更方便的测试数据,可以不用在前端写,在应用文件下随便创一个文件输入指定代码
# 在manage.py中拷走以下代码
import os
if __name__ == "__main__":
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "day64.settings")
    import django
    django.setup()
操作测试
    # 增加数据
    # 1 直接创建一个数据对象
    res = models.User.objects.create(name='hz',age=18,register_time='2020-5-30')
    print(res)
    import datetime
    ctime = datetime.datetime.now()
    # 2 用用类实例化对象,并保存
    user_obj = models.User(name='egon',age=84,register_time=ctime)
    print(user_obj)
    user_obj.save()
    # 删
    # 1 用filter筛选得到的结果都是queryset对象存放一个个数据对象
    # pk映射主键字段
    res = models.User.objects.filter(pk=2)
    print(res)
    res.delete()
    # 2 找到具体的数据对象并删除
    user_obj = models.User.objects.filter(pk=1).first().delete()
    print(user_obj)
    # 改
    models.User.objects.filter(pk=1).update(name='lxt')
    res = models.User.objects.filter(name='hz').update(age=16)
    print(res)
总结:通过filter获得对象是queryset对象,可以delete,可以update,都是对这个对象内的所有元素统一进行操作
filter筛选过后用first得到的是对象中的第一个数据对象,数据对象也同样可以delete,update
如果把filter换成get会直接得到数据对象,但是这种方法如果找不到就会直接报错,不推荐使用
二、必知必会13个方法
# all(),filter(),get()不多bb
# first和last获取的都是对应的数据对象
res = models.User.objects.filter(age=16).last()
# values获得的是列表套字典
res = models.User.objects.values('name','age')
# values_list获得的是列表套元组
res = models.User.objects.values_list('name','age')
# 只有queryset对象才能.query去查看这条语句对应的sql代码
res = models.User.objects.all().query
# 去重要注意必须把主键排除在外
res = models.User.objects.values('name').distinct()
# order_by排序默认升序,字段加-号表示以该字段降序
res = models.User.objects.order_by('-age')
# reverse使用的前提必须在order_by之后
res = models.User.objects.order_by('age').reverse()
# exclude 排除某个筛选条件除外的数据对象
res = models.User.objects.exclude(age=17)
# 判断某个筛选条件的数据是否存在,不常用
res = models.User.objects.filter(pk=10).exists()
三、查看内部的sql语句的方法
方式一:在queryset对象后.query
方式二:所有sql语句都能看,就要去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',
        },
    }
}
四、神奇的双下划线查询
# 1 年龄大于35岁的数据
res = models.User.objects.filter(age__gt=35)
# print(res)
# 2 年龄小于35岁的数据
res = models.User.objects.filter(age__lt=35)
# 3 大于等于 小于等于
res = models.User.objects.filter(age__gte=32)
res = models.User.objects.filter(age__lte=32)
# 4 年龄是18 或者 32 或者40
res = models.User.objects.filter(age__in=[18,32,40])
# 5 年龄在18到40岁之间的  首尾都要
res = models.User.objects.filter(age__range=[18,40])
# 6 查询出名字里面含有s的数据  模糊查询
res = models.User.objects.filter(name__contains='s')
# 7 是否区分大小写  查询出名字里面含有p的数据  区分大小写
res = models.User.objects.filter(name__contains='p')
# 8 忽略大小写
res = models.User.objects.filter(name__icontains='p')
res = models.User.objects.filter(name__startswith='j')
res1 = models.User.objects.filter(name__endswith='j')
# 9 查询出注册时间是 2020 1月
res = models.User.objects.filter(register_time__month='1')
res = models.User.objects.filter(register_time__year='2020')
五、一对多外键的增删改查
# 增
# 1 直接写实际字段
models.Book.objects.create(title='lunyu',price=19.9,publish_id=1)
# 2 虚拟字段(对象)
publish_obj = models.Publish.objects.filter(pk=1).first()
models.Book.objects.create(title='liaozhai',price=18.5,publish=publish_obj)
# 删
# 1.x中删除就是常规删除,因为会级联删除所以不用考虑其他表
models.Publish.objects.filter(pk=2).delete()
# 修改
# 1 直接写实际字段
models.Book.objects.filter(pk=4).update(publish_id=2)
# 2 虚拟字段(对象)
publish_obj = models.Publish.objects.filter(pk=2).first()
models.Book.objects.filter(pk=5).update(publish = publish_obj)
总结:在操作多对应的表的时候,修改外键字段可以放外键id,也可以放具体的外键对象
六、多对多外键的增删改查
# 增 给lunyu添加作者hz
book_obj = models.Book.objects.filter(pk=4).first()
book_obj.authors.add(1,2)
# 可以传单个也可以传多个 这里的1,2是指定添加的author的id,所以也可以添加具体的author对象
# 删 删除lunyu作者的姓名为hz的作者
book_obj = models.Book.objects.filter(title='lunyu').first()
author_obj = models.Author.objects.filter(name='hz').first()
book_obj.authors.remove(author_obj)
# 删除同样也可以传id,也可以指定多个
# 修改lunyu作者只能是id=1的作者
book_obj = models.Book.objects.filter(title='lunyu').first()
book_obj.authors.set((1,2))
# 括号内放的是可迭代对象,有的不会改,没有的就新增
# 清空lunyu的所有作者
book_obj = models.Book.objects.filter(title='lunyu').first()
book_obj.authors.clear()
总结:多对多操作先要获取一个数据对象,然后.外键字段名不需要加_id
添加时,add可以传多个值,可id,可对象
删除时,remove可以传多个值,可id,可对象
修改时,set可以传多个值,可id,可对象,已有的不会变,增加新添的
清空时,clert不需要传任何值
七、正反向查询概念
正向:外键字段在我这,我查你,就是正向
反向:外键字段在你这,我查你,就是反向
例子:book和publish,外键字段在book表中,由book查publish就是正向,反之反向
正向查询按字段,获取多个.all()
反向查询按表名,获取多个_set.all()
八、多表查询
1 三种表关系的正向查询
# 基于对象的跨表查询
# 查询书籍id=1的书的出版社
# 一对多,书查出版社,正向,按字段
book_obj = models.Book.objects.filter(pk=2).first()
res = book_obj.publish
# 拿到的是出版社对象
# 查询书籍id=4的作者
# 多对多,书查作者,正向,按字段
book_obj = models.Book.objects.filter(pk=4).first()
res = book_obj.authors.all()
# res存放的是queryset对象,列表套数据对象,QuerySet [<Author: Author object>, <Author: Author object>]>
# 查询作者hz的电话
# 一对一,作者查作者详情,正向,按字段
author_obj = models.Author.objects.filter(name='hz').first()
res = author_obj.author_detail.phone
总结:正向查询,按字段,记得不能加_id这是orm给我们创建表的时候自动加的
如果语句很长要分开慢慢写,切记不能因为简写出错
要注意获得的结果可能多个还是一个
比如多对多,拿到的可能是多个,就要加.all(),获取的对象会放在一个queryset对象内
如果是,一对多,一对一,拿到的只能是一个,就会直接得到数据对象
2 三种表关系的反向查询
# 反向
# 查询出版社是east的书
# 一对多,反向,取多个表名小写下_set
publish_obj = models.Publish.objects.filter(name='east').first()
res = publish_obj.book_set.all()
# 查询作者是hz写过的书
# 多对多,反向,取多个表名小写_set
author_obj = models.Author.objects.filter(name='hz').first()
res = author_obj.book_set.all()
print(res)
# 查询电话号码1555555的作者
# 一对一,反向,表名小写
author_detail_obj = models.AuthorDetail.objects.filter(phone=1555555).first()
res = author_detail_obj.author
print(res.name)
总结:如果得到的值是多个,需要表名小写_set.all(),如果只有一个就表名小写即可获得对应的数据对象
3 基于双下划线跨表查询
# 1 查询姓名为id为1的作者姓名和手机
# 正向
res = models.Author.objects.filter(name='hz').values('name','author_detail__phone')
# 反向
res = models.AuthorDetail.objects.filter(author__name='hz').values('author__name','phone')
# 2 查询书籍主键为1的出版社名称和书的名称
# 正向
res = models.Book.objects.filter(pk=1).values('title','publish__name')
# 反向
res = models.Publish.objects.filter(book__id=1).values('book__title','name')
# 3 查询书籍主键为1的作者姓名
# 正向
res = models.Book.objects.filter(pk=1).values('authors__name')
# 反向
res = models.Author.objects.filter(book__id=1).values('name')
# 4 查询书籍主键是1的作者的手机号
# 正向
res = models.Book.objects.filter(pk=1).values('authors__author_detail__phone')
# 反向
res = models.Author.objects.filter(book__id=1).values('author_detail__phone')
总结:其实掌握规律后,就可以无限制的跨表查询
day64 django模型层的更多相关文章
- django 模型层(2)
		Django 模型层(2) 多表操作---模型之间的关系 1 一对一:作者----作者详细信息 2 一对多:书籍----出版社 3 多对多:书籍----作者 一 创建模型(主键(id)自动创建) 没 ... 
- Django模型层(2)
		<!DOCTYPE html><html lang="zh-cn"><head><meta charset="utf-8&quo ... 
- {django模型层(二)多表操作}一 创建模型 二 添加表记录 三 基于对象的跨表查询 四 基于双下划线的跨表查询 五 聚合查询、分组查询、F查询和Q查询
		Django基础五之django模型层(二)多表操作 本节目录 一 创建模型 二 添加表记录 三 基于对象的跨表查询 四 基于双下划线的跨表查询 五 聚合查询.分组查询.F查询和Q查询 六 xxx 七 ... 
- Django模型层之ORM
		Django模型层之ORM操作 一 ORM简介 我们在使用Django框架开发web应用的过程中,不可避免地会涉及到数据的管理操作(如增.删.改.查),而一旦谈到数据的管理操作,就需要用到数据库管理软 ... 
- Django模型层之单表操作
		Django模型层之单表操作 一 .ORM简介 我们在使用Django框架开发web应用的过程中,不可避免地会涉及到数据的管理操作(如增.删.改.查),而一旦谈到数据的管理操作,就需要用到数据库管理软 ... 
- Django模型层之更多操作
		Django模型层之更多操作 一 .ORM字段 1.1 常用字段 AutoField int自增列,必须填入参数 primary_key=True.当model中如果没有自增列,则自动会创建一个列名为 ... 
- Django模型层(各种表及表数据的操作)
		目录 一.Django模型层 0. django模型层的级联关系 1. 配置django测试脚本 (1)方式一 (2)方式二 2. orm表数据的两种增删改 (1)方式一: (2)方式二: 3. pk ... 
- day 70  Django基础五之django模型层(二)多表操作
		Django基础五之django模型层(二)多表操作 本节目录 一 创建模型 二 添加表记录 三 基于对象的跨表查询 四 基于双下划线的跨表查询 五 聚合查询.分组查询.F查询和Q查询 六 ORM ... 
- day  69  Django基础五之django模型层(一)单表操作
		Django基础五之django模型层(一)单表操作 本节目录 一 ORM简介 二 单表操作 三 章节作业 四 xxx 一 ORM简介 MVC或者MVC框架中包括一个重要的部分,就是ORM,它实现 ... 
随机推荐
- 介绍几种给你的Python代码加上酷炫的进度条的方式
			前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 大家好,在下载某些文件的时候你一定会不时盯着进度条,在写代码的时候使用进度 ... 
- javaScript的执行机制-同步任务-异步任务-微任务-宏任务
			一.概念理解 1.关于javascript javascript是一门单线程语言,在最新的HTML5中提出了Web-Worker,但javascript是单线程这一核心仍未改变.所以一切javascr ... 
- Java学习之第二天
			一.流程控制 1.顺序结构:自上而下,依次执行(从上到下,一直走下去) 2.选择结构:(1)if .if—else.嵌套if (2)switch(mod){ case 1:执行代码 case 2:执行 ... 
- redis 深入理解redis 主从复制原理
			redis 主从复制 master 节点提供数据,也就是写.slave 节点负责读. 不是说master 分支不能读数据,也能只是我们希望将读写进行分离. slave 是不能写数据的,只能处理读请求 ... 
- 【JMeter_10】JMeter逻辑控制器__ForEach控制器<ForEach Controller>
			ForEach控制器<ForEach Controller> 业务逻辑: ForEach控制器一般与用户自定义变量/JDBC结果变量一起使用,可以认为他就是一种遍历型循环,该节点下的脚本内 ... 
- YII2.0安装教程,数据库配置前后台
			1.首先下载yii-advanced-app-2.0.6.tgz 我本地服务用的是Apache 2.解压到E:\wamp\www\yii2目录下面将目录advanced下所有文件剪切到 E:\wamp ... 
- cb20a_c++_string类型的查找
			cb20a_c++_string类型的查找s.find(args) //精确匹配,顺序查找, abc, 连续的包含在abcde,或者fabcde;s.rfind(args) //精确匹配.反向查找s. ... 
- cb11a_c++_顺序容器的操作4_容器大小操作_resize-max_size
			cb11a_c++_顺序容器的操作4 2 容器大小的操作 3 c.size() 容器当前的个数 4 c.max_size(),容器最大存储量 5 c.empty() 是否为空 6 c.resize(n ... 
- 'ipconfig' 不是内部或外部命令,也不是可运行的程序 或批处理文件
			今天在学习的时候需要找本地ip地址,可是在命令行窗口却显示 百度之后发现原来是环境变量没配置的问题(其实之前是ok的,但应该是anconda安装的时候点了那个一键设置环境变量搞得本地的path里的数据 ... 
- async/await剖析
			async/await剖析 JavaScript是单线程的,为了避免同步阻塞可能会带来的一些负面影响,引入了异步非阻塞机制,而对于异步执行的解决方案从最早的回调函数,到ES6的Promise对象以及G ... 
