Django测试环境搭建

ps:
1.pycharm连接数据库都需要提前下载对应的驱动
2.自带的sqlite3对日期格式数据不敏感
如果后续业务需要使用日期辅助筛选数据那么不推荐使用sqlite3 方式1: 任意创建一个py文件,在该文件内书写固定的配置
import os
if __name__ == '__main__':
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'djangoProject2.settings')
import django
django.setup()
# 单独测试Django py文件 方式2: 直接使用pycharm提供的python console

单表查询关键字

QuerySet对象方法
query # 查看orm内部对应的SQL语句 from app01 import models
# res = models.Books.objects.all()
# print(res) # <QuerySet []> # 增
# res = models.Books.objects.create(title='三国演义',price=234.43)
# res = models.Books.objects.create(title='水浒传',price=456.22)
# res = models.Books.objects.create(title='西游记',price=687.90)
# print(res.title)
'''create返回值就是当前被创建的数据对象'''
# 查
# res = models.Books.objects.all()
# print(res.query)
# SELECT `app01_books`.`id`, `app01_books`.`title`, `app01_books`.`price`, `app01_books`.`publish_time` FROM `app01_books`
# res = models.Books.objects.filter() # QuerySet
# print(res.query)
# res = models.Books.objects.filter(title='西游记',price=123.23) # AND
# res = models.Books.objects.filter(title='jason')
# res = models.Books.objects.filter(title='西游记')
# res = models.Books.objects.filter(title='西游记')[0]
# print(res) # <QuerySet [<Books: 西游记>]>
"""filter括号内可以放多个参数 默认是and关系 返回一个QuerySet对象 条件不符合不会报错返回QuerySet空对象 可以通过索引提取对象本身"""
# res1 = models.Books.objects.get(title='西游记')
# print(res1) # 西游记
"""get括号内可以放多个参数 默认是and关系 直接拿到对象本身 条件不符合直接报错 不推荐使用"""
# 改
# res = models.Books.objects.filter(pk=1).update(price=666.66)
# print(res) # 返回值是受影响的行数 # book_obj = models.Books.objects.filter(pk=2).first()
# book_obj.price = 999.66
# book_obj.save() # 效率低(所有字段重新写一遍)
"""pk能够自动查找到当前表的主键字段 我们不需要查看当前表主键字段名"""
# 删
# models.Books.objects.filter(pk=1).delete() # 1.first() 取第一个数据对象
# res = models.Books.objects.all().first()
# res1 = models.Books.objects.all()[0]
# res2 = models.Books.objects.all()[0:2]
# print(res,res1,res2)
"""QuerySet对象还支持切片操作 但是只能填正数"""
# 2.last() 取最后一个数据对象
# res = models.Books.objects.all().last()
# print(res)
# 3.values() 获取数据指定字段的值
# res = models.Books.objects.all().values('title','publish_time')
# res = models.Books.objects.values('title','publish_time')
# print(res.query)
"""all()加不加都表示所有数据 values获取的结果 类似于列表套字典"""
# 4.values_list() 获取数据指定字段的值
# res = models.Books.objects.values_list('title','publish_time')
# print(res)
"""values_list获取的结果 类似于列表套元组"""
# 5.order_by() 排序
# res = models.Books.objects.order_by('price') # 默认是升序
# print(res)
# res1 = models.Books.objects.order_by('-price') # 减号降序
# print(res1)
# 6.count() 计数
# res = models.Books.objects.count() # 统计数据条数
# print(res)
# 7.distinct() 去重
# res = models.Books.objects.distinct()
# print(res)
# res = models.Books.objects.values('title').distinct()
# print(res)
"""去重的前提是数据必须是一模一样 一定不能忽略主键"""
# 8.exclude() 排除什么什么在外 取反操作
# res = models.Books.objects.exclude(title='西游记')
# print(res.query)
# 9.reverse()
# res = models.Books.objects.all()
# res1 = models.Books.objects.reverse()
# res2 = models.Books.objects.order_by('price').reverse()
# print(res)
# print(res1)
# print(res2)
"""reverse需要先排序之后才能反转"""
# 10.exists() 判断是否有数据 返回布尔值
# res = models.Books.objects.all().exists()
# print(res)

神奇的双下划线查询(范围查询)

    # 1.查询价格大于700的书籍
# res = models.Books.objects.filter(price__gt=700) # WHERE `app01_books`.`price` > 700
# print(res)
# print(res.query)
# 2.查询价格小于700的书籍
# res = models.Books.objects.filter(price__lt=700)
# print(res)
# 查询价格大于等于700 小于等于700
# res1 = models.Books.objects.filter(price__gte=700) # WHERE `app01_books`.`price` >= 700
# res2 = models.Books.objects.filter(price__lte=700) # WHERE `app01_books`.`price` <= 700
# print(res1.query,res2.query)
# 3.查询价格要么是666.66 要么是999.66 要么是10000
# res = models.Books.objects.filter(price__in=[666.66,999.66,10000])
# print(res)
"""python对数字不是很敏感 精确度不高 很多时候我们会采取字符串存储数字类型"""
# 4.查询价格在500到800之间的
# res = models.Books.objects.filter(price__range=(500,800)) # WHERE `app01_books`.`price` BETWEEN 500 AND 800
# print(res.query) # 5.查询书名中包含字母s的书
# res = models.Books.objects.filter(title__contains='s') # 区分大小写
# print(res.query) # WHERE `app01_books`.`title` LIKE BINARY %s%
# 忽略大小写
# res = models.Books.objects.filter(title__icontains='s')
# print(res.query) # WHERE `app01_books`.`title` LIKE %s% # 查询以什么开头 结尾
# res = models.Books.objects.filter(title__startswith='三')
# print(res) # 6.查询出版日期是2021的书
# res = models.Books.objects.filter(publish_time__year=2021)
# print(res.query) # WHERE `app01_books`.`publish_time` BETWEEN 2021-01-01 AND 2021-12-31
# 7.查询出版日期是9月的书
# res = models.Books.objects.filter(publish_time__month=9)
# print(res)
# 8.查询出版日期是20日的书
# res = models.Books.objects.filter(publish_time__day=20)
# print(res)

图书管理系统表设计

class Book(models.Model):
title = models.CharField(verbose_name='书名', max_length=32)
price = models.DecimalField(verbose_name='价格', max_digits=8, decimal_places=2)
publish_time = models.DateField(verbose_name='出版日期',auto_now_add=True)
# 一对多 外键字段建在多的一方
# 出版社外键 一对多
publish = models.ForeignKey(to='Publish',on_delete=models.CASCADE) # 默认就是主键
"""自动在外键字段后面加_id后缀"""
# 多对多 外键字段推荐建在查询频率较高的表中
# 作者外键 多对多
authors = models.ManyToManyField(to='Author') # 自动帮你创建书籍和作者的第三张表
"""虚拟字段不会在表中实例化出来 而是告诉ORM创建第三张关系表""" class Publish(models.Model):
title = models.CharField(verbose_name='名称',max_length=32)
addr = models.CharField(verbose_name='地址',max_length=128)
email = models.EmailField(verbose_name='邮箱') class Author(models.Model):
name = models.CharField(verbose_name='姓名',max_length=32)
age = models.IntegerField(verbose_name='年龄')
# 一对一 外键字段推荐建在查询频率较高的表中
# 作者详情外键 一对一
author_detail = models.OneToOneField(to='AuthorDetail',on_delete=models.CASCADE)
"""自动在外键字段后面加_id后缀""" class AuthorDetail(models.Model):
phone = models.BigIntegerField(verbose_name='电话')
addr = models.CharField(verbose_name='地址',max_length=32) """
作者详情表
作者表
出版社表 书籍表和关系表通过orm实现
"""

外键字段操作

   # 外键字段
# 直接传主键值
# models.Book.objects.create(title='聊斋',price=666.98,publish_id=1)
# models.Book.objects.create(title='聊斋志异2',price=666.98,publish_id=2)
# 传数据对象
# publish_obj = models.Publish.objects.filter(pk=1).first()
# models.Book.objects.create(title='神雕侠侣',price=234.56,publish=publish_obj) # 改
# models.Book.objects.filter(pk=1).update(publish_id=2)
# publish_obj = models.Publish.objects.filter(pk=1).first()
# models.Book.objects.filter(pk=4).update(publish=publish_obj) # 多对多外键字段
# 增
book_obj = models.Book.objects.filter(pk=1).first()
# 主键值
# book_obj.authors.add(2) # 去第三张关系表中 与作者主键为2的绑定关系
# 作者对象
# author_obj = models.Author.objects.filter(pk=3).first()
# book_obj.authors.add(author_obj)
# 括号内支持传多个参数
# book_obj.authors.add(1,2)
# author_obj1 = models.Author.objects.filter(pk=1).first()
# author_obj2 = models.Author.objects.filter(pk=2).first()
# book_obj.authors.add(author_obj1,author_obj2) # 改
# book_obj.authors.set([3,])
# book_obj.authors.set((1,2))
# author_obj1 = models.Author.objects.filter(pk=1).first()
# author_obj2 = models.Author.objects.filter(pk=2).first()
# book_obj.authors.set((author_obj1,author_obj2)) # 删
# book_obj.authors.remove(1)
# book_obj.authors.remove(1,2)
# book_obj.authors.remove(author_obj1,author_obj2) # 清空
# book_obj.authors.clear() # 去第三张关系表中删除所有该书籍对应的记录
"""
add()
remove()
括号内既可以传数字也可以传对象 逗号隔开即可
set()
括号内必须传递可迭代对象 可迭代对象内既可以传数字也可以传对象 支持多个
clear()
清空操作 无需传值
"""

跨表查询理论

正向
外键字段在谁哪儿,谁查另外的就是正向
反向
没有外键字段
# 判断是否有关联的外键字段 """
正向查询按外键字段
反向查询按表名小写 _set
"""

基于对象的跨表查询

# 子查询
"""
1.先查询出一个对象
2.基于对象点正反向字段
""" 反向查询表名小写加_set
查询的对象可能有多个的情况
查询的对象只有一个的情况不需要加_set # 基于对象的跨表查询
# 1.查询聊斋书籍对应的出版社名称
# book_obj = models.Book.objects.filter(title='聊斋').first()
# res = book_obj.publish
# print(res)
# print(res.title) # 2.查询神雕侠侣对应的作者
# book_obj = models.Book.objects.filter(title='神雕侠侣').first()
# res = book_obj.authors # app01.Author.None
# res = book_obj.authors.all()
# print(res) # 3.查询jason的地址
# author_obj = models.Author.objects.filter(name='jason').first()
# res = author_obj.author_detail
# print(res)
# print(res.phone,res.addr) # 4.查询东方出版社出版过的书籍
# publish_obj = models.Publish.objects.filter(title='东方出版社').first()
# res = publish_obj.book_set.all()
# print(res) # 5.查询jason写过的书
# author_obj = models.Author.objects.filter(name='jason').first()
# res = author_obj.book_set.all()
# print(res) # 6.查询电话是110的作者姓名
# authordetail_obj = models.AuthorDetail.objects.filter(phone=110).first()
# res = authordetail_obj.author
# print(res)
# print(res.name,res.age)

基于双下划线的跨表查询

# 链表查询
# 基于双下划线的跨表查询
# 1.查询聊斋书籍对应的出版社名称
# res = models.Book.objects.filter(title='聊斋').values('publish__title')
# print(res)
# 2.查询神雕侠侣对应的作者
# res = models.Book.objects.filter(title='神雕侠侣').values('authors__name','authors__age')
# print(res)
# 3.查询jason的地址
# res = models.Author.objects.filter(name='jason').values('author_detail__addr')
# print(res)
# 4.查询东方出版社出版过的书籍
# res = models.Publish.objects.filter(title='东方出版社').values('book__title')
# print(res)
# 5.查询jason写过的书
# res = models.Author.objects.filter(name='jason').values('book__title')
# print(res)
# 6.查询电话是110的作者姓名
# res = models.AuthorDetail.objects.filter(phone=110).values('author__name')
# print(res) # 1.查询聊斋书籍对应的出版社名称 不能用models.Book
# res = models.Publish.objects.filter(book__title='聊斋')
# res = models.Publish.objects.filter(book__title='聊斋').values('title')
# print(res)
# 2.查询神雕侠侣对应的作者
# res = models.Author.objects.filter(book__title='神雕侠侣').values('name')
# print(res)
# 3.查询jason的地址
# res = models.AuthorDetail.objects.filter(author__name='jason').values('addr')
# print(res) # 查询神雕侠侣对应的作者的电话和地址
# res = models.Book.objects.filter(title='神雕侠侣').values('authors').values('authors__author_detail__phone','authors__author_detail__addr')
# res = models.Book.objects.filter(title='神雕侠侣').values('authors__author_detail__phone','authors__author_detail__addr')
# res = models.Author.objects.filter(book__title='神雕侠侣').values('author_detail__phone','author_detail__addr')
# print(res) 1.普通函数以__开头
说明当前函数只在当前模块(py)下使用,尽量不在外部调用

Django学习——Django测试环境搭建、单表查询关键字、神奇的双下划线查询(范围查询)、图书管理系统表设计、外键字段操作、跨表查询理论、基于对象的跨表查询、基于双下划线的跨表查询的更多相关文章

  1. Django 模版语法 测试环境 ORM单表查询

    模版语法 传值 视图函数向前端html页面传值,基本上所有的数据类型都可以渲染在前端页面上. views.py from django.shortcuts import render, redirec ...

  2. Django学习笔记 开发环境搭建

    为什么使用django?1.支持快速开发:用python开发:数据库ORM系统,并不需要我们手动地构造SQL语句,而是用python的对象访问数据库,能够提升开发效率.2.大量内置应用:后台管理系统a ...

  3. 【Django学习笔记】-环境搭建

    对于初学django新手,根据以下步骤可以快速进行Django环境搭建 虚拟环境创建 使用virtualenv创建并启用虚拟机环境 ,关于virtualenv可参考https://www.yuque. ...

  4. Django 学习笔记之一 环境搭建

    以后的文章都是在windows系统进行的 首先下载安装Django包 方式1:使用 pip或easy_insatll来进行安装 同时按住win+R键,弹出命令行运行框输入,pip install Dj ...

  5. Django学习日记01_环境搭建

    1. 使用Vagrant 创建ubuntu虚拟机: 首先安装vagrant,网上有比较多的方法,如:http://www.th7.cn/system/mac/201405/55421.shtml 我使 ...

  6. Linux测试环境搭建的学习建议

    随着Linux应用的扩展许多朋友开始接触Linux,根据学习Windwos的经验往往有一些茫然的感觉:不知从何处开始学起.这里介绍学习Linux测试环境搭建的一些建议. 一.Linux测试环境搭建从基 ...

  7. Django学习笔记(7)——单表操作和多表操作

    单表操作 1,创建模型 创建名为book的APP,在book下的models.py中创建模型: from django.db import models # Create your models he ...

  8. 使用admin的步骤、必知必会13条、单表的双下划线、外键的操作、多对多的操作:

    MVC M: model 模型 与数据库交互 V: view 视图 HTML C:controller 控制器 流程 和 业务逻辑 MTV M:model ORM T:template 模板 HTML ...

  9. Django 01 django基本介绍及环境搭建

    Django 01 django基本介绍及环境搭建 #http服务器 #用来接收用户请求,并将请求转发给web应用框架进行处理 #Web应用框架 #处理完请求后在发送给http服务器,http服务器在 ...

随机推荐

  1. Kafka 缺点?

    由于是批量发送,数据并非真正的实时: 对于mqtt协议不支持: 不支持物联网传感数据直接接入: 仅支持统一分区内消息有序,无法实现全局消息有序: 监控不完善,需要安装插件: 依赖zookeeper进行 ...

  2. JVM的基础知识

    一.JVM的基础知识 1.JVM内存结构: 1.JVM堆内存结构: 2.JVM内存分配: 3.Java的堆机构和垃圾回收: 4.Jvm堆内存配置参数: 5.JVM新生代概念和配置: 6.JVM老生代概 ...

  3. C语言杂谈

    C语言程序处理过程 预处理:宏定义展开.头文件展开.条件编译,这里并不会检查语法 编译:检查语法,将预处理后文件编译生成汇编文件 汇编:将汇编文件生成目标文件(二进制文件) 链接:将目标文件链接为可执 ...

  4. 所有用CSS3写的3D特效,都离不开这些知识

    起因 昨晚在做慕课网的十天精通CSS3课程,其中的综合练习是要做一个3D导航翻转的效果.非常高大上. 以往这些效果我都很不屑,觉得网上一大堆这些特效的代码,复制粘贴就好了,够快.但是现实工作中,其实自 ...

  5. safari浏览器fixed后,被软键盘遮盖的问题—【未解决】

    safari浏览器fixed后,被软键盘遮盖的问题,已经有好多人问相关的问题,应该是问的角度不一样,还的再次提出咯. 问题描述 测试环境:ios 10.2/10.3 简单来说就是在html5页面中底部 ...

  6. java连接oracle数据库(转)

    在做导游通项目所用到 package org.javawo.test; import java.sql.Connection; import java.sql.DriverManager; /** * ...

  7. 基于Vue+Vuex+iView的电子商城网站

    MALL-VUE 这是一个基于VUE + VUEX + iView做的一个电商网站前端项目, 附带前后端分离实现版本(在forMallServer分支),欢迎fork或star 项目地址: https ...

  8. ES6-11学习笔记--类与继承

    ES5 中的类与继承: 类的定义: function People(name, age) { // this指向当前实例化对象 console.log(this); // 实例属性 this.name ...

  9. 论文阅读总结-Patient clustering improves efficiency of federated machine learning to predict mortality and hospital stay time using distributed electronic medical records

    一.论文提出的方法: 使用进入ICU前48h的用药特征作为预测因子预测重症监护患者的死亡率和ICU住院时间. 用到了联邦学习,自编码器,k-means聚类算法,社区检测. 数据集:从50家患者人数超过 ...

  10. Hive进行数据统计时报错:org.apache.hadoop.mapreduce.v2.app.MRAppMaster: Error starting MRAppMaster

    报错详情: 2020-04-09 22:56:58,827 ERROR [Listener at 0.0.0.0/45871] org.apache.hadoop.mapreduce.v2.app.M ...