Django测试脚本-单表操作(增删改查)-必知必会13条-神奇的双下划线

一: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

image

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和数据库

image

二:单表操作

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()

image

三:必知必会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')
posted @ 2022-03-02 15:04  AlexEvans  阅读(103)  评论(0编辑  收藏  举报