Django基础之模型(models)层

Django测试环境搭建:拷贝manage.py中的行代码放到tests.py文件中导入模块

import django,django.setup()

如果你想查看orm语句内部真正的sql语句有2种方法:

1.如果是queryset对象,就可以.query查看该queryset对象的内部sql语句

2.在settings.py文件中配置

LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'handlers': {
'console': {
'level': 'DEBUG',
'class': 'logging.StreamHandler',
},
},
'loggers': {
'django.db.backends': {
'handlers': ['console'],
'propagate': True,
'level': 'DEBUG',
},
}}

单表查询

方式一:

models.Book.objects.create(title = '三国演义',price = 12.22)

方式二:

book_obj = models.Book(title='三国演义',price='12.22')
book_obj.save()

models.Book.objects.filter(pk=2).delete()

models.Book.objects.filter(pk=2).update(title = '红楼梦',price = 22.22)

res = models.Book.objects.filter(pk=2)

必知必会13条

all():查所有,查询结果为Queryset对象

res = models.Book.objects.all()
print(res)

filter:查询结果为Queryset对象

res = models.Book.objects.filter(pk=2)

get():查询结果为数据对象本身,和filter查询相似,不推荐使用

res = models.Book.objects.get(pk=2)

first():查询第一个

res = models.Book.objects.first()

last():查询最后一个

res = models.Book.objects.last()   #res可以.title,.price

exclude():哪一个排除之外

res = models.Book.objects.exclude(pk=3)

values():查询结果为列表套字典的Queryset对象

res = models.Book.objects.values('title')

value_list():查询结果为列表套元组的Queryset对象

res = models.Book.objects.values_list('title')

count():统计数据的条数

res = models.Book.objects.count('title')
res = models.Book.objects.all.count('title')

distinct():数据必须是一模一样的情况下去重

res = models.Book.objects.distinct()  #无变化
res = models.Book.objects.values('title').distinct()

order_by():排序

res = models.Book.objects.order_by('price')   #默认升序
res = models.Book.objects.order_by('-price') #降序

reverse():排序后反转(才有意义)

res = models.Book.objects.reverse()

exists():是否存在

models.Book.objects.filter(pk=1).exists()

神奇的双下划线查询

查询价格大于200的书籍

models.Book.objects.filter(price__gt=200)

查询价格小于200的书籍

models.Book.objects.filter(price__lt=200)

查询价格大于等于200的书籍

models.Book.objects.filter(price__gte=200)

查询价格小于等于200的书籍

models.Book.objects.filter(price__lte=200)

查询价格是200元或者300元的书籍

res = models.Book.objects.filter(price__in=[200,300])

查询价格是200到500元之间的书籍

res = models.Book.objects.filter(price__range=(200,500))  #顾头不顾尾

查询书籍中包含p的书籍

res = models.Book.objects.filter(title__contains='p')   #区分大小写
res = models.Book.objects.filter(title__icontains='p')   #不区分大小写

查询书籍名称是以三开头的书籍

res = models.Book.objects.filter(title__startswith="三")

查询书籍名称是以三结尾的书籍

res = models.Book.objects.filter(title__endswith="三")

查询出版日期是2019年的书籍

res = models.Book.objects.filter(data__year="2019")

查询出版日期是10月份的书籍

res = models.Book.objects.filter(data__month="10")

多表查询

外键的字段的增删改查

一对多字段的增删改查

方式一:

models.Book.objects.create(title='xxx',price=66.66,publish_id=1)

方式二:

publish_obj =models.Publish.objects.filter(pk=2).first()
models.Book.objects.create(title='xxx',price=66.66, publish_id=publish_obj)

book_obj = models.Book.objects.filter(pk=1).first()
print(book_obj.publish.name)
print(book_obj.publish_id)

方式一:

models.Book.objects.filter(pk=3).update(publish_id=3)

方式二:

publish_obj = models.Publish.objects.filter(pk=1).first()
models.Book.objects.filter(pk=3).update(publish_id=publish_obj) #给书更换出版社

models.Book.objects.filter(pk=3).delete()

多对多字段的增删改查

方式一:

book_obj = models.Book.objects.filter(pk=3).first()
print(book_obj.author) # 就相当于已经到书籍与作者的关系表中
book_obj.author.add(1)
book_obj.author.add(2, 3) # 还可以添加多个值 author_obj = models.Author.objects.filter(pk=1).first()
book_obj.author.add(author_obj) author_obj = models.Author.objects.filter(pk=1).first()
author_obj1 = models.Author.objects.filter(pk=2).first()
book_obj.author.add(author_obj, author_obj1) # 还可以添加多个值 '''
add() 括号内 既可以串数字,也可以传对象
并且支持传多个
但是括号内必须是可迭代对象
'''

#方式一
book_obj = models.Book.objects.filter(pk=3).first()
book_obj.author.remove(2)
book_obj.author.remove(1,2) #方式二
author_obj = models.Author.objects.filter(pk=1).first()
author_obj1 = models.Author.objects.filter(pk=2).first()
book_obj.author.remove((author_obj, author_obj1)) '''
remove() 括号内 既可以串数字,也可以传对象
并且支持传多个
'''
#清空

book_obj = models.Book.objects.filter(pk=3).first()
book_obj.author.clear() '''clear括号内不需要传任何参数 直接清空当前书籍对象所有的记录'''

#方式一
book_obj = models.Book.objects.filter(pk=3).first()
book_obj.author.set([3, ]) #方式二
author_obj = models.Author.objects.filter(pk=1).first()
author_obj1 = models.Author.objects.filter(pk=2).first()
book_obj.author.set((author_obj, author_obj1)) '''
set() 括号内 既可以串数字,也可以传对象
并且支持传多个
但是括号内必须是可迭代对象
'''

表与表之间的关联查询

基于对象的跨表查询(子查询)

正向查询按字段 反向查询按表名小写

当该字段所对应的数据有多个的时候 需要加.all(),否则点外键字段直接就能够拿到数据对象

查询书籍是Python入门的出版社名称(一对多)

book_obj = models.Book.objects.filter(title='python入门').first()
print(book_obj.publish.name)
print(book_obj.publish.addr)

查询书籍主键为6的作者姓名(多对多)

book_obj = models.Book.objects.filter(pk=6).first()
print(book_obj.author) #None
print(book_obj.author.all()) #拿到当前这本书所有的作者

查询作者是Jason的手机号(一对一)

author_obj = models.Author.objects.filter(name='jason').first()
print(author_obj.author_detail.phone)

查询出版社是东方出版社出版过的书籍

publish_obj = models.Publish.objects.filter(name="东方出版社").first()
print(publish_obj.book_set.all())

查询作者是Jason写过的所有的书

author_obj = models.Author.objects.filter(name='json').first()
print(author_obj.book_set.all())

查询手机号是110的作者

phone_obj = models.AuthorDetail.objects.filter(phone=110).first()
print(phone_obj.author)

基于双下划线的跨表查询(连表查询)

查询书籍是Python入门的出版社名称

正向:

models.Book.objects.filter(name='python入门').values('publish__name')

反向:

models.Publish.objects.filter(book__title='python入门').value('name')

查询作者是jason的手机号码

正向:

models.Author.objects.filter(name='json').values('author_detail__phone')

反向

models.AuthorDetail.objects.filter(author__book__author='json').values('phone','author_age')  #还可以加自己的年龄

查询手机号是120的作者姓名和地址

正向

models.AuthorDetail.objects.filter(phone='120').values('author__name')

反向

models.Author.objects.filter(author_detail__phone=120).values('name',,'author_detail__addr')

查询出版社是东方出版社出版的书籍名称

正向:

models.Publish.objects.filter(name='东方出版社').values('book__title')

反向:

models.Book.objects.filter(author__book__publish='东方出版社').values('title')

查询作者是jason的写过的书的名字和价格

正向:

models.Author.objects.filter(name='json').values('book__title','book__price')

反向:

models.Book.objects.filter(author__name='json').values('title','price')

查询书籍是python入门的作者的手机号

正向:

models.Book.objects.filter(name='python入门').values('authors__author_detail__phone')

反向:

models.AuthorDetail.objects.filter(author__book__title='python入门').values('phone')

补充知识

auto_now:每次修改数据的时候,都会自动更新时间

auto_now_add:在创建数据的时候,会自动将当前时间记录下来,后期如果你不人为修改的话,数据不变

queryset:只要是queryset对象就可以无限的点queryset对象的方法

eg:一步步筛选

queryset.excult(pk=1).filter(pk=3).filter(pk=4)

return:return返回的必须是字符串,其他的类型直接报错,此处可以写在models.py中。

正反向概念:

书籍对象查出版社 外键字段在书籍 正向查询

出版社查书籍 外键字段在书籍 反向查询

Django基础之模型(models)层(上)的更多相关文章

  1. Django基础之视图(views)层、模板层

    目录 Django基础之视图(views)层.模板层 JsonResponse 向前端返回一个json格式字符串的两种方式 重写Django中的json的某个方法 form表单上传文件 FBV与CBV ...

  2. Django基础之路由(urls)层

    目录 Django基础之路由(urls)层 无名分组与有名分组 无名分组 有名分组 反向解析 前段解析 后端解析 无名分组反向解析 前段解析 后端解析 有名分组的反向解析 前段解析 后端解析 路由分发 ...

  3. Django基础(3)----模型层-单表操作,多表创建

    昨日内容回顾: 1. {% include '' %} 2. extend base.html: <html> ..... ..... ..... {% block content%} { ...

  4. Django基础之模型层(02)

    1 重要概念 # 多表查询 """ 正向查询 反向查询 当前查询对象是否含有外键字段 如果有就是正向 没有无则是反向 口诀: 正向查询按外键字段 多对多需要额外再加一个. ...

  5. Django基础之模型层(下)

    聚合查询 关键字:aggregate from django.db.models import Max,Min,Sum,Count,Avg 统计所有书的平均价格 models.Book.objects ...

  6. Django基础之模型层(01)

    内容概要 查询关键字 MySQL select    from    where    group by    having    order by    distinct    limit    r ...

  7. Django基础-02篇 Models的属性与字段

    1.models字段类型 AutoField():一个IntegerField,根据可用ID自动递增.如果没指定主键,就创建它自动设置为主键. IntegerField():一个整数: FloatFi ...

  8. 老师的blog整理 .网络编程部分 .网络编程部分 前端部分 django基础部分

    老师的blog整理 python基础部分: 宝哥blog: https://www.cnblogs.com/guobaoyuan/ 开哥blog: https://home.cnblogs.com/u ...

  9. 老师的blog整理 .网络编程部分 .网络编程部分 前端部分 django基础部分

    老师的blog整理 .网络编程部分 .网络编程部分 前端部分 django基础部分   老师的blog整理 python基础部分: 宝哥blog: https://www.cnblogs.com/gu ...

随机推荐

  1. super 和 this 的区别

    一 this和super关键字区别 1.子类的构造函数如果要引用super的话,必须把super放在函数的首位.2.super(参数):调用基类中的某一个构造函数(应该为构造函数中的第一条语句)3.t ...

  2. 省市县镇村五级地址智能提取(标准地址源来自国家统计局官网)SpringBoot+Elasticsearch 5.6

    项目目的 根据传入的地址,智能提取所属的省市县镇村5级地址.例如:用户输入“江苏南通嗨安李堡镇陈庄村8组88号”,我们需要提取到江苏省  南通市  海安县(即便用户输入了错字,“海”写成了“嗨”) 李 ...

  3. LNMP源码编译

    LNMP源码编译 编译安装之前把开发包组安装了 [root@tiandong63 ~]# yum groupinstall "Development Tools" "De ...

  4. OkHttp3 拦截器源码分析

    OkHttp 拦截器流程源码分析 在这篇博客 OkHttp3 拦截器(Interceptor) ,我们已经介绍了拦截器的作用,拦截器是 OkHttp 提供的对 Http 请求和响应进行统一处理的强大机 ...

  5. (十)C语言之putchar、getchar

  6. Springboot集成MongoDB实现CRUD

    特别提示:本人博客部分有参考网络其他博客,但均是本人亲手编写过并验证通过.如发现博客有错误,请及时提出以免误导其他人,谢谢!欢迎转载,但记得标明文章出处:http://www.cnblogs.com/ ...

  7. tp5 get传参为中文时,需要解码 urldecode

    php 接收 $data = urldecode($data);

  8. umount 报错was not found in /proc/mounts

    前段时间在整理服务器时,看到nfs都是通过公网调用的,但是实际这几台服务器都是可以内网互通的,为了更稳定的使用,打算把这些挂载都更改为通过内网ip挂载,什么都设置好之后,操作第一台服务器没有问题,um ...

  9. Android jni/ndk编程一:jni初级认识与实战体验

    Android平台很多地方都可以看到jni的身影,比如之前接触到一个投屏的项目,主要的代码是c/c++写的,然后通过Jni供Java层调用;另外,就拿Android系统中的Service来说,很多的S ...

  10. 提交SVN Working copy locked解决

    今天一大早提交SVN的时候,出现这个错误: 百度了一下原因:因为我强制在commit的时候退出了,导致svn项目文件被锁了,不能commit,不能update了 赶紧百度了一下解决办法: http:/ ...