Django测试脚本-单表操作(增删改查)-必知必会13条-神奇的双下划线
- 一:Django测试脚本
- 二:单表操作
- 三:必知必会13条
- 1.all查询所有数据
- 2.filter 过滤条件
- 3.get 直接拿数据对象 条件不存在报错
- 4.first() 拿queryset里面第一个元素
- 5.last() 拿queryset里面最后一个元素
- 6.values() 可以指定获取的数据字段 列表套字典 K:v
- 7.values_list() 列表套元组 v
- 8.distinct() 去重
- 9.order_by() 排序
- 10.reverse() 反转的前提是数据已经排过序了 order_by()
- 11.count() 统计当前数据的个数 User内
- 12.exclude() 排除在外
- 13.exists() 不存在返回布尔值False 存在返回True
- 15.查看内容封装的SQL语句
- 四:神奇的双下划线查询
一:Django测试脚本
当你只是想测试django中的某一个py文件内容 那么你可以不用书写前后端交互的形式
而是直接写一个测试脚本即可
1.测试环境准备
- 脚本代码无论是写在应用下的tests.py还是自己单独开设py文件都可以
2.tests.py
# 测试环境的准备 去manage.py中拷贝前四行代码 然后自己写两行
import os
import sys
if __name__ == "__main__":
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "djangooneday64.settings")
# 自己写两行
import django
django.setup()
# 在这个代码块的下面就可以测试django里面的单个py文件了
# 导入app01文件夹内models文件
from app01 import models
# 测试models文件内User运行
models.User.objects.all()
3.models.py
from django.db import models
class User(models.Model):
name = models.CharField(max_length=32)
age = models.IntegerField()
register_time = models.DateTimeField()
"""
DateField : 年月日
DateTimeField : 年月日 时分秒
两个重要参数
auto_now : 每次操作数据的时候 该字段会自动将当前时间更新
auto_now_add : 在创建数据的时候会自动将当前创建时间记录下来 之后只要不人为的修改 那么就一直不变
"""
def __str__(self):
return '对象:%s' % self.name

4.切换MySQL数据库
1.设置配置文件mysql替换sqllite3
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'day64',
'USER': 'root',
'PASSWORD': '123',
'HOST': '127.0.0.1',
'PORT': 3306,
'CHARSET': 'utf8',
}
}
2.配置__init__文件 PyMySQL替换MySQLdb
import pymysql
pymysql.install_as_MySQLdb()
3.提前配置好navicat和数据库

二:单表操作
1.pk关键字与get关键字
# pk关键字:
pk会自动查找到当前表的主键字段 指代的就是当前表的主键字段
用了pk之后 你就不需要指代当前表的主键字段到底叫什么了
如下例:
uid
pid
sid
# get关键字:
get方法返回的直接就是当前数据对象 但是该方法不推荐使用
一旦数据不存在会直接报错 而filter则不会
- 注意:
django自带的sqlite3数据库对日期格式不是很敏感 处理的时候容易出错
2.增
# 日期字符串
res = models.User.objects.create(name='objk', age=18, register_time='2002-1-21')
# 返回值当前创建对象本身
print(res)
# 日期对象
import datetime
# # 日期对象
ctime = datetime.datetime.now()
user_obj = models.User(name='egon', age=84, register_time=ctime) # 支持字符串日期和日期对象
# 保存
user_obj.save()
3.删
# 批量删除
res = models.User.objects.filter(pk=2) # pk=2 等价于 id=2
# 返回值 影响的行数
# 单一针对性删除
user_obj = models.User.objects.filter(pk=1).filter()
user_obj.delete()
4.修
# 修改
models.User.objects.filter(pk=5).update(name='egonDSB')
# 先获取在修改
user_obj = models.User.objects.get(pk=4) # 值不存在报错
user_obj = models.User.objects.filter(pk=6) # 值不存在返回null
print(user_obj)
# 对象点name 修改值
user_obj.name = 'egonPPP'
user_obj.save()

三:必知必会13条
all() : 查询所有数据
filter() : 筛选
get() : 直接拿数据对象 条件不存在报错
first() : 拿queryset里面第一个元素
last() : 拿queryset里面最后一个元素
values() : 可以指定获取的数据字段 列表套字典 字典内K:V值
values_list() : 列表套元组 元组内V值
distinct() : 去重
order_by() : 排序
reverse() : 反转的前提是数据已经排序过了 order_by()
count() : 统计当前数据的个数
exclude() : 括号内数据排除在外
exists() : 存在返回True 不存在返回False
1.all查询所有数据
res = models.User.objects.all()
print(res)
<QuerySet [<User: 对象:egon>, <User: 对象:egonDSB>, <User: 对象:objk>]>
2.filter 过滤条件
res = models.User.objects.filter(pk=5).delete()
3.get 直接拿数据对象 条件不存在报错
res = models.User.objects.get(id=5)
print(res)
对象:egonDSB
4.first() 拿queryset里面第一个元素
res = models.User.objects.all().first()
print(res)
对象:egon
5.last() 拿queryset里面最后一个元素
res = models.User.objects.all().last()
print(res)
对象:objk
6.values() 可以指定获取的数据字段 列表套字典 K:v
SQL语句 : select name,age from *
res = models.User.objects.values('name', 'age')
print(res)
<QuerySet [{'name': 'egon', 'age': 84}, {'name': 'objk', 'age': 18}]>
7.values_list() 列表套元组 v
res = models.User.objects.values_list('name', 'age')
print(res)
<QuerySet [('egon', 84), ('objk', 18)]>
print(res.query) # 查看内容封装的SQL语句
SELECT `app01_user`.`name`, `app01_user`.`age` FROM `app01_user`
"""
查看内部封装的sql语句
1.上述查看sql语句方式 只能用于queryset对象
2.只有queryset对象才能够点击query查看内部sql语句
"""
8.distinct() 去重
res = models.User.objects.values('name', 'age').distinct()
print(res)
"""
去重条件
1.去重一定要是一模一样的数据
2.如果带有主键那么肯定不一样 你在往后的查询中一定不要忽略主键
"""
9.order_by() 排序
res = models.User.objects.order_by('age') # 默认升序
< QuerySet[ < User: 对象:objk >, < User: 对象:egon >] >
res = models.User.objects.order_by('-age') # 降序
< QuerySet[ < User: 对象:egon >, < User: 对象:objk >] >
print(res)
10.reverse() 反转的前提是数据已经排过序了 order_by()
res = models.User.objects.all()
<QuerySet [<User: 对象:egon>, <User: 对象:objk>]>
res1 = models.User.objects.order_by('age').reverse() # 升序改为降序
<QuerySet [<User: 对象:objk>, <User: 对象:egon>]>
print(res1)
11.count() 统计当前数据的个数 User内
res = models.User.objects.count()
print(res)
2
12.exclude() 排除在外
res = models.User.objects.exclude(name='objk') # 查询name='objk'之外的数据 其实就是排除数据
print(res)
<QuerySet [<User: 对象:egon>]>
13.exists() 不存在返回布尔值False 存在返回True
res = models.User.objects.filter(pk=10).exists()
print(res)
False
15.查看内容封装的SQL语句
values_list() 列表套元组 v
res = models.User.objects.values_list('name', 'age')
print(res.query) # 查看内容封装的SQL语句
SELECT `app01_user`.`name`, `app01_user`.`age` FROM `app01_user`
查看内部封装的sql语句
1.上述查看sql语句方式 只能用于queryset对象
2.只有queryset对象才能够点击query查看内部sql语句
四:神奇的双下划线查询
1.双下划线查询语法
大于 : __gt
小于 : __lt
大于等于 : __gte
小于等于 : __lte
或者 : __in in走索引 not in 不走索引
之间 : __range
模糊查询 : __contains
区分大小写 : __icontains
忽略大小写 : __icontains
以什么开头 : __startswith
以什么结尾 : __endswith
查询注册时间 : register_time__year
2.双下划线查询
# 1 年龄大于35岁的数据
res = models.User.objects.filter(age__gt=35)
print(res)
# 2 年龄小于35岁的数据
res = models.User.objects.filter(age__lt=35)
print(res)
# 3.大于等于 小于等于
res = models.User.objects.filter(age__gte=32)
print(res)
res = models.User.objects.filter(age__lte=32)
print(res)
# 4.年龄是18 或者 32 或者40
res = models.User.objects.filter(age__in=[18,32,40])
print(res)
# 5.年龄在18到40岁之间的 首尾都要
res = models.User.objects.filter(age__range=[18,40])
print(res)
# 6.查询出名字里面含有s的数据 模糊查询
res = models.User.objects.filter(name__contains='s')
print(res)
like查询不走索引
# 7.是否区分大小写 查询出名字里面含有p的数据 区分大小写
res = models.User.objects.filter(name__contains='p')
print(res)
# 8.忽略大小写
res = models.User.objects.filter(name__icontains='p')
print(res)
# 9.以字符开头
res = models.User.objects.filter(name__startswith='j')
# 10.以字符结尾
res1 = models.User.objects.filter(name__endswith='j')
print(res,res1)
# 11.查询出注册时间是 2020 1月
res = models.User.objects.filter(register_time__month='1')
res = models.User.objects.filter(register_time__year='2020')
Django测试脚本-单表操作(增删改查)-必知必会13条-神奇的双下划线的更多相关文章
- Django学习笔记--数据库中的单表操作----增删改查
1.Django数据库中的增删改查 1.添加表和字段 # 创建的表的名字为app的名称拼接类名 class User(models.Model): # id字段 自增 是主键 id = models. ...
- Django中对单表的增删改查
之前的简单预习,重点在后面 方式一: # create方法的返回值book_obj就是插入book表中的python葵花宝典这本书籍纪录对象 book_obj=Book.objects.creat ...
- Django学习笔记(10)——Book单表的增删改查页面
一,项目题目:Book单表的增删改查页面 该项目主要练习使用Django开发一个Book单表的增删改查页面,通过这个项目巩固自己这段时间学习Django知识. 二,项目需求: 开发一个简单的Book增 ...
- python全栈开发day61-django简单的出版社网站展示,添加,删除,编辑(单表的增删改查)
day61 django内容回顾: 1. 下载: pip install django==1.11.14 pip install -i 源 django==1.11.14 pycharm 2. 创建项 ...
- hibernate对单表的增删改查
ORM: 对象关系映射(英语:Object Relational Mapping,简称ORM,或O/RM,或O/R mapping) 实现对单表的增删改查 向区域表中增加数据: 第一步: 新建一个Da ...
- django模型层 关于单表的增删改查
关于ORM MTV或者MVC框架中包括一个重要的部分,就是ORM,它实现了数据模型与数据库的解耦,即数据模型的设计不需要依赖于特定的数据库, 通过简单的配置就可以轻松更换数据库,这极大的减轻了开发人员 ...
- $Django 多表操作(增删改查,基于双下划线,对象的查询) 在Python脚本中调用Django环境
在Python脚本中调用Django环境. import osif __name__ == '__main__': os.environ.setdefault("DJANGO_SETTING ...
- django 利用ORM对单表进行增删改查
牛小妹上周末,一直在尝试如何把数据库的数据弄到界面上.毕竟是新手,搞不出来,文档也看不懂.不过没关系,才刚上大学.今晚我们就来解释下,要把数据搞到界面的第一步.先把数据放到库里,然后再把数据从库里拿出 ...
- django模型层之多表操作 增删改查
多表操作之创建模型 这边以书为中心创建一个模型 作者模型:一个作者有姓名和年龄. 作者详细模型:把作者的详情放到详情表,包含生日,手机号,家庭住址等信息.作者详情模型和作者模型之间是一对一的关系(on ...
- $Django 模板层(模板导入,继承)、 单表*详(增删改查,基于双下划线的查询)、static之静态文件配置
0在python脚本中使用django环境 import osif __name__ == '__main__': os.environ.setdefault("DJANGO_SETT ...
随机推荐
- PAT (Basic Level) Practice (中文)1015 德才论 分数 25
宋代史学家司马光在<资治通鉴>中有一段著名的"德才论":"是故才德全尽谓之圣人,才德兼亡谓之愚人,德胜才谓之君子,才胜德谓之小人.凡取人之术,苟不得圣人,君子 ...
- 数据火器库八卦系列之瑞士军刀随APP携带的SQLite
来源:云数据库技术 数据库打工仔喃喃自语的八卦历史 1. 为导弹巡洋舰设计,用在手机上的数据库 2. Small and Simple, and Better 3. 如何看出是自己的娃:产品定位,特点 ...
- css三角形文本框
<style type="text/css"> .triangle{/* 三角形图片位置 */ background-image: url(img/traintop.p ...
- POJ3237 Tree (树链剖分)
通过打懒标记实现区间取反,和线段树基本操作都差不多. 本题还是一道边权化为点权的问题. 200行巨长代码: 1 #include<cstdio> 2 #include<cstring ...
- Es 学习笔记 (1)
目录 前言 什么是es? es数据组织类比 应用场景 核心概念 集群 节点(node) 索引(Index) 文档类型(Type) 文档(Document) Mapping 核心简单域类型 分片(sha ...
- 2022.3.12 提高A组总结&反思
今天有点上头了 T1:开场秒,大水题,一眼莫队了,最后没打 T2:开场以为是费用流,后来发现费用流做不了,在做T3的时候突然发现可以状压,也没打 T3:这道题给我极大的亲切感,导致我一个上午硬钢这道题 ...
- Python-D4-语法入门2
目录 数据类型 数据类型之整型int 数据类型之浮点型float 数据类型之字符串str 数据类型之列表list 数据类型之字典dict 基本数据类型之布尔值bool 基本数据类型之元祖tuple 基 ...
- 通过netty把百度地图API获取的地理位置从Android端发送到Java服务器端
本篇记录我在实现时的思考过程,写给之后可能遇到困难的我自己也给到需要帮助的人. 写的比较浅显,见谅. 在写项目代码的时候,需要把Android端的位置信息传输到服务器端,通过Netty达到连续传输的效 ...
- 13.MongoDB系列之分片简介
1. 分片概念 分片是指跨机器拆分数据的过程,有时也会用术语分区.MongoDB既可以手工分片,也支持自动分片 2. 理解集群组件 分片的目标之一是由多个分片组成的集群对应用程序来说就像是一台服务器. ...
- .net lambda表达式合并
事情的起因是公司一个小伙子问了我个问题 "海哥,来帮我看下这段代码怎么不行" Func<Report,bool> nameFilter = x=>x.Name = ...