首页 > 其他分享 >django框架(五)

django框架(五)

时间:2022-12-18 14:45:41浏览次数:35  
标签:name 框架 models res django filter objects User

将某个html的部分提前写好 之后很多html页面想使用就可以导入

直接在要导入的地方用以下代码即可:
    {% include 'myform.html' %}
    
#仅适用于页面某个小的区域,不适用整个页面

image

django模型层

1)前期准备

django自带的sqlite3数据库对时间字段不敏感,会展示错乱 所以习惯会切换成常见数据库:MySQL
django orm不会自动创建库需要提前准备好

1.cmd中创建库
create database 库名;

2.settings.py配置文件中把库sqlite3改为mysql
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'day55', # 库名
        'USER': 'root',
        'PASSWORD': '123',
        'HOST': '127.0.0.1',
        'PORT': 3306,
        'CHARSET': 'utf8'}
    
3.模型层models.py中写入模型类(写张表)
class User(models.Model):
    name = models.CharField(max_length=32, verbose_name='用户名')
    age = models.IntegerField(verbose_name='年龄')
    register_time = models.DateTimeField(verbose_name='注册时间', auto_now_add=True)

    def __str__(self):
        return f'用户对象:{self.name}'
    
4.写完模型类后执行数据库迁移命令
    python38 manage.py makemigrations
    python38 manage.py migrate
创建模型类补充知识
#字段参数:
verbose_name='用户名' #类似加一个注释
————————————————————————————————————————————————
#时间字段:
DateTimeField #年月日时分秒
DateField #年月日

#时间字段参数:
auto_now=True #每次操作数据都会自动更新当前时间
auto_now_add=True #创建数据自动获取当前时间,后续不人为修改则不更新
________________________________________________
# 模型类下创建__str__方法,可以让对象在执行打印操作时更好区分这是哪个对象
def __str__(self):
    return f'用户对象:{self.name}'

2)测试环境搭建

需求:单独测试django某个功能层
django默认不允许单独测试某个py文件 如果想要测试某个py文件(主要models.py):

#方法一: 不建议使用,关掉就没
pycharm最下面选择Python Console 命令行测试环境

from app01 import models
models.User.objects.filter()

————————————————————————————————————————————————

#方法二:自己搭建 【推荐】
1.去manage.py文件中把前四行代码拷贝出来
2.在tests.py中下面一行粘贴上面四行代码 再额外加两句即可写测试代码

import os
import sys
def main():
    os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'day55.settings')
    
    import django
    django.setup()
    
    from app01 import models
    print(models.User.objects.filter())

if __name__ == '__main__':
    main()

image

3)ORM常见关键字

orm查看底层sql语句

由于orm底层还是sql语句,所以支持查看底层sql语句怎么生成的

1.当手上的结果是一个QuerySet对象 那么可以直接点query查看SQL语句

res = models.User.objects.all().values('name')
print(res)
"""
<QuerySet [{'name': 'jason'}, {'name': 'torry'}, {'name': 'kevin'}]
"""
print(res.query)
"""
SELECT `app01_user`.`name` FROM `app01_user`
"""

image

2.如果想查看所有orm底层的SQL语句 也可以在配置文件添加日志记录

#【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',
        },
    }
}

当执行ORM语句后就会在下面打印出对应的SQL语句:

image

(1)create()

创建数据 打印的返回值是当前创建的数据对象

res = models.User.objects.create(name='阿兵', age=28)
res = models.User.objects.create(name='oscar', age=18)
res = models.User.objects.create(name='jerry', age=38)
res = models.User.objects.create(name='jack', age=88)
print(res)

image

(2)filter()

根据条件筛选数据 结果是QuerySet [数据对象1,数据对象2] 列表套数据对象

res = models.User.objects.filter()#QuerySet [数据对象1,数据对象2]
res = models.User.objects.filter(name='jason')
res = models.User.objects.filter(name='jason', age=18)#括号内支持多个条件但是默认是and关系(都成立结果才成立)

image

(3)all()

查询所有数据(不能筛选) 结果是列表套对象

res = models.User.objects.all()
(4)first()、last()

first()获取Queryset中第一个数据对象 如果为空不存在则返回None
last()获取Queryset中最后一个数据对象 如果为空则返回None

推荐用first不推荐索引的原因是:如果没有该数据索引会报错

# res = models.User.objects.filter(pk=100)[0]
res = models.User.objects.filter(pk=100).first()
res = models.User.objects.filter().last()

image

(5)update()

更新/更改数据

models.User.objects.filter().update()     批量更新
models.User.objects.filter(id=1).update() 单个更新
(6)delete()

删除数据(批量删除)

models.User.objects.filter().delete()      批量删除
models.User.objects.filter(id=1).delete()  单个删除
(7)values()

根据指定字段获取数据 结果是列表套字典数据

#获取所有条件中的name对应的值(后面跟.first()可以获取第一个)
res = models.User.objects.all().values('name')
res = models.User.objects.filter().values('name')
res = models.User.objects.values('name')
#获取主键是1的age对应的值
res = models.User.objects.filter(pk=1).values('age')
(8)values_list()

根据指定字段获取数据 结果是列表套元组数据

res = models.User.objects.values_list('name')
(9)distinct()

去重 需注意:数据必须一样(包括主键),一般都会去掉主键后去重

#把所有数据的年龄字段去重
res = models.User.objects.filter().values('age').distinct()
res1 = models.User.objects.all().values('age').distinct()

image

(10)order_by()

根据指定条件排序 默认是升序 字段前面加负号就是降序

res = models.User.objects.all().order_by('age')
res = models.User.objects.all().order_by('-age')
(11)get()

直接根据条件查询具体的数据对象 一旦条件不存在会直接报错 不建议使用

#获取主键是1的数据
res = models.User.objects.get(pk=1)
(12)exclude()

针对括号内的条件'取反'进行数据查询 QuerySet(可以看成是列表套对象)

#获取id不等于1的数据对象
res = models.User.objects.exclude(pk=1)
(13)reverse()

颠倒顺序 针对已排了序的结果集做颠倒 用的较少因为排序前面加-号就可以实现

res1 = models.User.objects.all().order_by('age').reverse()
(14)count()

统计结果集中数据的个数

res = models.User.objects.all().count()
(15)exists()

判断结果集中是否含有数据 如果有则返回True 没有则返回False

几乎不用因为所有数据自带布尔值

res = models.User.objects.all().exists()

标签:name,框架,models,res,django,filter,objects,User
From: https://www.cnblogs.com/lvqingmei/p/16990367.html

相关文章

  • django框架(六)
    ORM执行SQL语句有时候ORM的操作效率可能偏低,其实也支持自己写SQL语句#方式1:#注意表名res=models.User.objects.raw('select*fromapp01_userwhereid<3;')......
  • django框架(部分讲解)
    图书管理系统讲解前期准备工作修改配置文件表设计考虑普通字段考虑外键字段数据库迁移连接数据库插入数据测试数据录入首页展示创建一个h......
  • Pytorch框架详解之一
    Pytorch基础操作numpy基础操作定义数组(一维与多维)寻找最大值维度上升与维度下降数组计算矩阵reshape矩阵维度转换代码实现importnumpyasnpa=np.array([......
  • 【Python自动化框架pytest(三)--数据驱动(参数化)】
    参数化,就是把测试过程中的数据提取出来,通过参数传递不同的数据来驱动用例运行。其实也就是数据驱动的概念。在Unittest中,我们讲过使用ddt库配合unittest实现数据驱动......
  • 【Python自动化框架pytest(四)--其他】
    一、pytest中的skip和xfailskip跳过测试函数skip意味着您希望只有在满足某些条件时测试才能通过,否则pytest应该跳过运行测试。常见的例子是跳过非Windows平台上的仅限Wind......
  • 框架第七课---图书管理系统详解
    ..homePage.html页面代码<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><title>Title</title>{#<scriptsrc="jQuery3.6.js"></scrip......
  • pytest + yaml 框架 -17.文件上传功能
    前言本插件集成了requests_toolbelt插件处理Content-Type:multipart/form-data类型文件上传接口。文件上传multipart/form-data用fiddler抓包,查看抓到的接口,以下这......
  • pytest框架
    在pytest框架中,有如下约束:所有的单测文件名都需要满足test_*.py格式或*_test.py格式。在单测文件中,测试类以Test开头,并且不能带有init方法(注意:定义class时,需要以T开头,......
  • 手撸web框架
    egon新书来袭请看:https://egonlin.com/book.html一Web应用的组成接下来我们学习的目的是为了开发一个Web应用程序,而Web应用程序是基于B/S架构的,其中B指的是浏览器,负责......
  • pytest + yaml 框架 -16.提供一个常用的内置函数和方法生成随机测试数据
    前言在测试的过程中经常会用到一些随机值,比如生成随机手机号,随机身份证,姓名等数据。内置方法目前暂时提供了3个内置函数,和1个内置对象current_time(f:str='%Y-%m-%......