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. R-ets()

    前情需知 指数预测模型 指数模型是用来预测时序未来值的最常用模型.这类模型相对比较简单,但是实践证明它们的短期预测能力较好.不同指数模型建模时选用的因子可能不同.比如 单指数模型(simple/sin ...

  2. DB 分库分表(2):全局主键生成策略

    DB 分库分表(2):全局主键生成策略 本文将主要介绍一些常见的全局主键生成策略,然后重点介绍flickr使用的一种非常优秀的全局主键生成方案.关于分库分表(sharding)的拆分策略和实施细则,请 ...

  3. ajax 415

    ajax 发送post请求是出现415错误,是ajax的格式有问题,如下. $.ajax({ type: 'POST', url: '/login', data: { "username&q ...

  4. 安装两个版本的python安装包,后安装的python程序打开时闪退

    1.环境变量的问题 (Win7)右键打开“计算机”的属性设置→高级系统设置→环境变量.  在系统变量中的path中,编辑,在末尾加入Python的安装路径“F:\Python27”, 路径与路径之间使 ...

  5. Qt加载本地字体 .ttc或.ttf

    版权声明:支持原创,转载请说明~ https://blog.csdn.net/luoyayun361/article/details/54934437 //设置本地字体,黑体简 int fontId ...

  6. tensorflow源码分析——BasicLSTMCell

    BasicLSTMCell 是最简单的LSTMCell,源码位于:/tensorflow/contrib/rnn/python/ops/core_rnn_cell_impl.py.BasicLSTMC ...

  7. ccf 201612-4 压缩编码(DP)(100)

    ccf 201612-4 压缩编码 问题分析: 解决本问题,首先需要知道哈夫曼编码.参见:哈夫曼编码_百度百科. 这是一个编码问题,似乎可以用哈夫曼编码来解决,但是略有不同的地方在于“每个字符的编码按 ...

  8. js携带参数跳转controller返回页面

    upauth:function(){ var record = myForm.getRecord(); var companywyId = record.get("companyId&quo ...

  9. linux中的i2c控制器驱动应该做些什么?

    答:完成读写功能即可,不要涉及任何针对从设备的特殊操作,这样就可以避免与从设备的代码产生冗余,linux中的i2c控制器驱动就做的特别棒,做好最简单的读写,然后其它的从设备驱动就是直接调用这些最简单的 ...

  10. Oracle 基表 X$KSMLRU

    Oracle 基表 X$KSMLRU 该表是Oracle的一个内部表.当SQL或者PL/SQL块向shared pool中请求一个大的连续的空间时,如果shared pool中连续的可用空间 不足,就 ...