今日内容:

模型层:就是rom 操作数据库的增删改查

ps:在django中 你可以写一个单独测试某一个py文件的测试脚本 不需要再频繁的走web请求,也可以在tests里面写需要导入固定句式的模块:

1 import os
2
3
4 if __name__ == "__main__":
5     os.environ.setdefault("DJANGO_SETTINGS_MODULE", "day55.settings")
6     import django
7     django.setup()
8     """在下面就可以写针对某一个py文件的测试代码"""
9     from app01 import models

View Code

首先创建模型表出来:

 1 # 书籍表
 2 class Book(models.Model):
 3     title = models.CharField(max_length=255)
 4     price = models.DecimalField(max_digits=8, decimal_places=2)
 5     publish_date = models.DateField(auto_now_add=True)
 6     # 书籍表和出版社表建立一对多关系
 7     publish = models.ForeignKey(to='Publish')  # 默认是跟publish的主键字段做的一对多外键关联
 8     # 书籍表和作者表建立多对多关系
 9     authors = models.ManyToManyField(to='Author')
10
11     # 虚拟字段      1.自动创建第三张表    2.帮助orm跨表查询
12     def __str__(self):
13         return self.title
14
15 # 出版社表
16 class Publish(models.Model):
17     name = models.CharField(max_length=32)
18     addr = models.CharField(max_length=32)
19
20
21     def __str__(self):
22         return self.name
23
24 # 作者表
25 class Author(models.Model):
26     name = models.CharField(max_length=32)
27     age = models.IntegerField()
28     # 作者表和作者详情表建立一对一关系
29     author_detail = models.OneToOneField(to='AuthorDetail')
30
31     def __str__(self):
32         return self.name
33
34 #作者详情表
35 class AuthorDetail(models.Model):
36     phone = models.BigIntegerField()
37     addr = models.CharField(max_length=64)
38     """
39     models.py中的模型类__str__方法 必须返回一个字符串形式数据!!!
40
41     """
42
43     def __str__(self):
44         return self.addr

View Code

补充:神奇的双下滑线查询

    神奇的双下划綫查询价格大于 小于 大于等于  小于等于   在什么之间  或好几个选择price__gtprice__ltprice__gteprice__lteprice__inprice__range书籍名称中包含title__contains='p'title__icontains='p'创建的年份create_time__year

详细操作:

 1   """神奇的双下滑查询"""
 2     # 查询价格大于200的书籍
 3     # res = models.Book.objects.filter(price__gt=200)
 4     # print(res)
 5     # 查询价格小于200的书籍
 6     # res = models.Book.objects.filter(price__lt=200)
 7     # print(res)
 8
 9     # 查询价格大于等于200.22的书籍
10     # res = models.Book.objects.filter(price__gte=200.22)
11     # print(res)
12     # 查询价格小于等于200.22的书籍
13     # res = models.Book.objects.filter(price__lte=200.22)
14     # print(res)
15
16     # 查询价格要么是200,要么是300,要么是666.66
17     # res = models.Book.objects.filter(price__in=[200,300,666.66])
18     # print(res)
19     # 查询价格在200到800之间的
20     # res = models.Book.objects.filter(price__range=(200,800))  # 两边都包含
21     # print(res)
22
23     # 查询书籍名字中包含p的
24     """原生sql语句 模糊匹配
25         like
26             %
27             _
28     """
29     # res = models.Book.objects.filter(title__contains='p')  # 仅仅只能拿小写p
30     # res = models.Book.objects.filter(title__icontains='p')  # 忽略大小写
31     # print(res)
32
33     # 查询书籍是以三开头的
34     # res = models.Book.objects.filter(title__startswith='三')
35     # res1 = models.Book.objects.filter(title__endswith='p')
36     # print(res)
37     # print(res1
38
39     # 查询出版日期是2017的年(******)
40     res = models.Book.objects.filter(create_time__year='2017')
41     print(res)

View Code

1.一对多字段的增删改查:

    # 一对多字段的增删改查# 增 有俩个方法# 1.字段名 publish_id 直接传数字models.Book.objects.create(title='三国演义',price=199.99,publish_id=1)# 2.获取你要传入的出版社对象 然后 publish直接传出版社对象publish_obj = models.Publish.objects.filter(pk=2).first()models.Book.objects.create(title='红楼梦',price=999.99,publish=publish_obj)# 改 也是俩种方法# 1.字段名 publish_id 直接传数字models.Book.objects.filter(pk=1).update(publish_id=3)# 2.获取你要修改的出版社对象 然后 publish直接传要修改出版社对象publish_obj = models.Publish.objects.filter(pk=2).first()models.Book.objects.filter(pk=1).update(publish=publish_obj)# 删 # 默认是级联删除 级联更新models.Publish.objects.filter(pk=1).delete()

2.多对多字段的增删改查

 1 一共就4个方法:
 2  add()
 3     set()
 4     remove()
 5     上面三个都支持传数字 或者对象 并且可以传多个 但是set需要传可迭代对象
 6     clear()
 7     clear括号内不需要传任何参数
 8
 9  # 增:
10     # 1. 要为主键为1的书籍添加2个作者  通过数字
11     book_obj = models.Book.objects.filter(pk=1).first()
12     # # 对象点击多对多虚拟字段 会直接跨到多对多的第三张表
13     print(book_obj.authors) # app01.Author.None
14     book_obj.authors.add(1)
15     book_obj.authors.add(2,3)
16
17     # 2.通过对象
18     author_obj = models.Author.objects.filter(pk=1).first()
19     author_obj1 = models.Author.objects.filter(pk=2).first()
20     author_obj2 = models.Author.objects.filter(pk=3).first()
21     book_obj = models.Book.objects.filter(pk=1).first()
22     book_obj.authors.add(author_obj)
23     book_obj.authors.add(author_obj1,author_obj2)
24     '''
25     注意:add()
26     是给书籍添加作者  括号内既可以传数字也可以传对象
27     并且支持一次性传多个  逗号隔开即可
28     '''
29
30     # 改
31     # 1.传数字
32     # 将主键1的书籍对象 作者修改为2,3
33     book_obj = models.Book.objects.filter(pk=1).first()
34     book_obj.authors.set([2,])
35     book_obj.authors.set([2,3])
36
37     # 2.传对象
38     author_obj = models.Author.objects.filter(pk=1).first()
39     author_obj1 = models.Author.objects.filter(pk=2).first()
40     author_obj2 = models.Author.objects.filter(pk=3).first()
41     book_obj = models.Book.objects.filter(pk=1).first()
42     book_obj.authors.set([author_obj,])
43     book_obj.authors.set([author_obj,author_obj1,author_obj2])
44     '''
45     注意:set()
46      set()括号内 需要传一个可迭代对象
47     可迭代对象中 可以是多个数字组合
48     也可以是多个对象组合
49     但是不要混着用!!!
50     '''
51     # 删
52     # 1.传数字
53     book_obj = models.Book.objects.filter(pk=1).first()
54     book_obj.authors.remove(3)
55     book_obj.authors.remove(1,2)
56     # 2. 传对象
57     author_obj = models.Author.objects.filter(pk=1).first()
58     author_obj1 = models.Author.objects.filter(pk=2).first()
59     author_obj2 = models.Author.objects.filter(pk=3).first()
60     book_obj = models.Book.objects.filter(pk=1).first()
61     book_obj.authors.remove(author_obj)
62     book_obj.authors.remove(author_obj1,author_obj2)
63     '''
64     注意:
65     remove()括号内既可以传数字 也可以传对象
66     并且支持传对个 逗号隔开即可
67     '''
68     # clear() 清空所有数据
69     book_obj = models.Book.objects.filter(pk=1).first()
70     book_obj.authors.clear() # 清空当前书籍与作者的所有关系

View Code

跨表查询(重点):相当于 子查询

子查询:将一张表的查询结果当做另外一个查询语句的条件
跨表查询分为 正向查询和反向查询正向与反向的概念:# 一对一# 正向:author---关联字段在author表里--->authordetail        按字段# 反向:authordetail---关联字段在author表里--->author        按表名小写# 一对多# 正向:book---关联字段在book表里--->publish        按字段# 反向:publish---关联字段在book表里--->book        按表名小写_set.all() 因为一个出版社对应着多个图书# 多对多# 正向:book---关联字段在book表里--->author        按字段# 反向:author---关联字段在book表里--->book        按表名小写_set.all() 因为一个作者对应着多个图书
说简单点就是:
基于找的这一方有外键字段就是正向,没有就是反向正向查询按外键字段
反向查询按表名小写重点:
当你正向查询的时候,查询的结果是多个,那么就需要 点all()

   当你反向查询的结果是多个的时候 就需要加_set 在点all()   否则直接表明小写即可
 

View Code

基于双下滑线的跨表查询:相当于连表操作

left joininner joinright joinunion

 1   # 1.查询zy作者的手机号
 2     # 正向
 3     res = models.Author.objects.filter(name='zy').values('author_detail__phone')
 4     print(res)
 5     # 反向   因为是反向查询,筛选条件用表名小写,然后双下滑线等于名字,再拿到这个人的手机号
 6     res1 = models.AuthorDetail.objects.filter(author__name='zy').values('phone')
 7     print(res1)
 8
 9     # 2.查询zy这个作者的家庭住址和手机号
10     # 正向
11     res = models.Author.objects.filter(name='zy').values('author_detail__addr','author_detail__phone')
12     print(res)
13     # 反向
14     res1 = models.AuthorDetail.objects.filter(author__name='zy').values('addr','phone')
15     print(res1)
16
17     # 3.查询
18     # 查询手机号是130的作者家庭住址
19     # 正向
20     res = models.AuthorDetail.objects.filter(phone=130).values('author__addr')
21     print(res)
22     # # 反向
23     res1 = models.Author.objects.filter(author_detail__phone=130).values('addr')
24     print(res1)
25
26     # 4.查询书籍id是1 的作者的电话号码               外键字段一 外键字段二  普通字段
27     res = models.Book.objects.filter(pk=1).values('authors__author_detail__phone')
28     print(res) # 只要表里面有外键字段 你就可以无限制跨多张表
29
30     # 1.查询出版社为北方出版社的所有图书的名字和价格
31     res = models.Publish.objects.filter(name='北方出版社').values('book__title','book__price')
32     print(res)
33
34     # 2.查询北方出版社出版的价格大于19的书
35     res = models.Book.objects.filter(price__gt=19,publish__name='北方出版社').values('title','publish__name')
36     print(res)

View Code

聚合函数:

  # 聚合函数:关键字参数(aggregate)# 首先需要导入聚合函数from django.db.models import Max,Min,Count,Avg,Sumres = models.Book.objects.aggregate(Sum('price'))res1 = models.Book.objects.aggregate(Avg('price'))res2 = models.Book.objects.aggregate(Count('price'))res3 = models.Book.objects.aggregate(Max('price'))res4 = models.Book.objects.aggregate(Min('price'))res5 = models.Book.objects.aggregate(Max('price'),Min('price'),Count('pk'),Avg('price'),Sum('price'))print(res5)print(res)print(res1)print(res2)

分组查询:

 # 分组查询跟数据库的分组是一样的,只不过django里面用的是:annotate# 分组跟聚合函数配合使用"""只要是queryset对象 就可以无限制的调用queryset对象的方法!!!最最常用的就是对一个已经filter过滤完的数据 再进行更细化的筛选"""from django.db.models import Max,Min,Count,Avg,Sum# 1.统计每一本书的作者个数        给书籍的数量起个名字                   书籍的数量res = models.Book.objects.annotate(author_num=Count('authors')).values('author_num','title')print(res)# 2.统计出每个出版社卖的最便宜的书的价格res = models.Publish.objects.annotate(mmp = Min('book__price')).values('mmp','name')print(res)# 3.统计不止一个作者的图书res = models.Book.objects.annotate(author_num=Count('authors')).filter(author_num__gt=1)print(res)# 4.查询各个作者出的书的总价格res = models.Author.objects.annotate(sp=Sum('book__price')).values('name','sp')print(res)

F查询:

    # F查询的本质就是从数据库中获取某个字段的值'''之前查询等号后面的条件都是我们人为输入的,现在变成了需要从数据库中获取数据放在等号后面'''# 使用之前需要先导入模块from django.db.models import F# 1.查询库存数大于卖出数的书籍res = models.Book.objects.filter(kucun__gt=F('maichu'))print(res)# 2.将书籍库存数全部增加1000res = models.Book.objects.update(kucun=F('kucun')+1000)print(res)# 3.把所有书名后面加上'新款'from django.db.models.functions import Concatfrom django.db.models import Valueret3 = models.Book.objects.update(title=Concat(F('title'), Value('新款')))# models.Book.objects.update(title = F('title')+'新款')  # 不能这么写

Q查询:

 from django.db.models import Q# 查询书籍名称是三国演义或者价格是444.44的书res = models.Book.objects.filter(title='三国演义',price=444.44)  # filter只支持and关系res1 = models.Book.objects.filter(Q(title='三国演义'),Q(price=444))  # 如果用逗号 那么还是and关系res2 = models.Book.objects.filter(Q(title='三国演义')|Q(price=444)) #orres3 = models.Book.objects.filter(~Q(title='三国演义')|Q(price=444)) #not  print(res2)

Q高级查询:

  # Q高级用法q = Q()q.connector = 'or'  # 修改查询条件的关系   默认是andq.children.append(('title__contains','三国演义'))  # 往列表中添加筛选条件q.children.append(('price__gt',444))  # 往列表中添加筛选条件res = models.Book.objects.filter(q)  # filter支持你直接传q对象  但是默认还是and关系print(res)

转载于:https://www.cnblogs.com/zahngyu/p/11553083.html

django框架 day05相关推荐

  1. Django框架之第二篇

    Django框架之第二篇 一.知识点回顾 1.MTV模型 model:模型,和数据库相关的 template:模板,存放html文件,模板语法(目的是将变量如何巧妙的嵌入到HTML页面中). view ...

  2. Windows上python开发--2安装django框架

    Windows上python开发--2安装django框架 分类: 服务器后台开发2014-05-17 21:22 2310人阅读 评论(2) 收藏 举报 python django 上一篇文章中讲了 ...

  3. Python技术学习之Django框架设计思想

    Python是目前比较流行的计算机编程语言,据用丰富和强大的库,被称为胶水语言,能够把用其他语言制作的各种模块很轻松地联结在一起. Python功能强大,用途广泛,可广泛应用于云计算.web开发.科学 ...

  4. django框架使用mysql报错,及两种解决方法

    1.django框架 settings.py文件中部分代码: DATABASES = {# 'default': {# 'ENGINE': 'django.db.backends.sqlite3',# ...

  5. django框架--路由系统

    目录 一.路由系统理解 二.路由系统功能划分 三.路由表创建 创建工具 二级路由 路由别名 动态路由及重定向 四.自定义错误页面 五.图示路由系统在框架中的定位 六.路由系统的进阶想法 一.路由系统理 ...

  6. Python3搭建Django框架浅析

    前言 Python下有许多款不同的 Web 框架.Django是重量级选手中最有代表性的一位.许多成功的网站和APP都基于Django. Django 是一个开放源代码的 Web 应用框架,由 Pyt ...

  7. Django框架学习索引

    索引目录 1.Django介绍与安装 2.Django流程及模式 3.Django基本配置 4.Django模板(Templages) 1.Django的介绍和安装 3.Django框架模式 4.数据 ...

  8. Django 框架入门篇(安装与创建项目)

    什么是Django框架? 官方定义:Django是一个高级Python Web框架,鼓励快速开发和简洁实用的设计.它由经验丰富的开发人员构建,可以解决大部分Web开发的麻烦,因此您可以专注于编写应用程 ...

  9. 第九章 Django框架——csrf请求伪造和csrf_token使用

    第九章 Django框架--csrf请求伪造和csrf_token使用 一.csrf请求伪造 二.csrf_token使用 三.简单的csrf_token应用 四.Ajax使用csrf_token 一 ...

最新文章

  1. 软件架构设计学习总结(1):标准Web系统的架构分层
  2. PWA即将推向所有Chrome平台
  3. 七 web爬虫讲解2—urllib库爬虫—状态吗—异常处理—浏览器伪装技术、设置用户代理...
  4. 问题:从键盘读取特定类型的数据(使用Scanner读取int类型)
  5. RabbitMQ(2) 一般介绍
  6. 在mybatis中调oracle dblink存储过程
  7. openpyxl 绘制饼形图_好享学丨快速上手Pythonmatplotlib 箱线图绘制,学术人必备
  8. 一步步编写操作系统 27 处理器微架构之流水线简介
  9. vim中的jk为什么是上下_JK轮胎的完整形式是什么?
  10. Bailian2698 八皇后【回溯】
  11. 聊一聊 http2.0
  12. clock_gettime接口和linux时间系统
  13. android 微信读书,微信读书(com.tencent.weread) - 5.4.3 - 应用 - 酷安
  14. Ubuntu下解压rar的分卷文件 faster_rcnn_models.part1.rar
  15. Python 科赫曲线绘制
  16. 基于 高德 + Windvane 的H5选址工具,纵享丝滑,对高德选址组件说:走你
  17. n维椭球体积公式_【三分钟知识点】初中物理公式大全,赶快收藏!
  18. 高考成绩等位分查询2021,干货│如何查询等位分?精确填报志愿必备......
  19. 双线性插值算法推导及代码实现
  20. 《杰克韦尔奇自传》读后感

热门文章

  1. Ubuntu中MongoDB的安装
  2. LeetCode题 - 13 罗马数字转整数
  3. 动态服务器以及WSGI
  4. 简单网络管理协议SNMP
  5. Spring Boot @Async 简单实践
  6. Windows下Squid 3.5安装及配置代理服务器
  7. Canny边缘检测及C++实现(转载)
  8. linux命令sort的用法,linux之sort命令的用法
  9. 数据可视化系列(六):场景案例显神通
  10. UML与需求分析进阶