当前位置: 首页 > news >正文

orm01

静态文件处理

静态文件:如:图片、音频、视频、css、js等静态文件的相关配置也在 `项目名/项目名/settings.py` 文件中进行配置
- 配置静态文件的访问路径`STATIC_URL`- 功能:通过哪个 url 地址找静态文件- 默认配置:`STATIC_URL = '/static/'`- 说明:指定访问静态文件时是需要通过 /static/xxx 或 http://IP:端口/static/xxx 获取的,xxx表示具体的静态资源位置
- 配置静态文件的存储路径`STATICFILES_DIRS`- STATICFILES_DIRS:保存的是静态文件在服务器端的存储位置- 该配置的值是一个元组,单元素时注意逗号

实验:使用Django显示静态图片资源

]# django-admin startproject mysite2]# vim mysite2/mysite2/settings.pyBASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))	# 当前项目的绝对路径MIDDLEWARE = [		# 中间件配置...# 'django.middleware.csrf.CsrfViewMiddleware',  # 注释掉 csrf,否则Django将会拒绝客户端发来的POST请求,报403响应...]...TEMPLATES = [{'BACKEND': 'django.template.backends.django.DjangoTemplates','DIRS':[os.path.join(BASE_DIR,"templates")],  # 指定模板目录...},]LANGUAGE_CODE = 'zh-Hans'		# 中文TIME_ZONE = 'Asia/Shanghai'  	# 东八区STATIC_URL = '/static/'			# 访问静态文件的URLSTATICFILES_DIRS = (os.path.join(BASE_DIR, 'static'),)  # 指定静态文件的存储目录# mysite2/static,注意元组中的逗号]# mkdir mysite2/templates			# 创建模板目录
]# mkdir mysite2/static				# 创建静态文件存储目录
]# mkdir mysite2/static/{image,css,js}
]# ls mysite2/static/image/Django.png		# 放入一张图片]# vim mysite2/mysite2/urls.py		# 主路由文件
from django.urls import path
from . import views
urlpatterns = [path("test_static", views.test_static),
]]# vim mysite2/mysite2/views.py		# 视图文件
from django.shortcuts import render
def test_static(request):return render(request, "test_static.html")]# vim mysite2/templates/test_static.html	# 模板
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>pictures<img src="http://127.0.0.1:8000/static/image/Django.png" width="200px" height="200px"><img src="/static/image/Django.png" width="200px" height="200px">
</body>
</html>]# python3 mysite2/manage.py runserver浏览器访问http://127.0.0.1:8000/test_static,成功显示两张图片
F12查看网络,可以发现,相同图片只加载一次# 标签加载静态文件 {% load static %} {% static 'xxx' %} 
]# vim mysite2/templates/test_static.html	# 模板
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>pictures<img src="http://127.0.0.1:8000/static/image/Django.png" width="200px" height="200px"><img src="/static/image/Django.png" width="200px" height="200px">{% load static %}<img src="{% static 'image/Django.png' %}" width="200px" height="200px"> 
</body>
</html>浏览器访问http://127.0.0.1:8000/test_static,成功显示三张图片
F12查看元素,可以发现,使用标签加载静态文件,显示为使用相对URL路径<img src="/static/image/Django.png" width="200px" height="200px">]# vim mysite2/mysite2/settings.pySTATIC_URL = '/statics/'		# 加个s
浏览器访问http://127.0.0.1:8000/test_static,只成功显示第三张图片

应用与分布式路由

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

创建应用并注册

应用在Django项目中是一个独立的业务模块,可以包含自己的路由,视图,模板,模型# 创建应用
]# cd 项目名
项目名]# python3 manage.py startapp 应用名# 应用内部结构
项目名]# ls 应用名/				migrations目录	# 保存数据迁移的中间文件__init__.py		# 应用子包的初始化文件admin.py		# 应用的后台管理配置文件apps.py			# 应用的属性配置文件models.py		# 与数据库相关的模型映射文件tests.py		# 应用的单元测试文件views.py		# 定义视图处理函数的文件# 注册应用
项目名]# vim 项目名/settings.pyINSTALLED_APPS = [...'应用名',  	# 安装应用...]
示例:音乐应用
]# django-admin startproject mysite3
]# cd mysite3
mysite3]# python3 manage.py startapp music		# 创建应用目录
mysite3]# vim mysite3/settings.py				# 注册应用INSTALLED_APPS = ['django.contrib.admin','django.contrib.auth','django.contrib.contenttypes','django.contrib.sessions','django.contrib.messages','django.contrib.staticfiles','music',]

配置分布式路由

Django中,主路由配置文件(项目名/项目名/urls.py)可以不处理用户具体路由,主路由配置文件可以做请求的分发(分布式请求处理)。具体的请求可以由各自的应用来进行处理。# 配置分布式路由:主路由文件——》子路由文件——》对应的视图文件(视图函数)
]# vim 项目名/项目名/urls.py			# 主路由文件
from django.urls import path, include	# 引入include
urlpatterns = [path("应用名/", include("应用名.urls")),# http://IP:端口/应用名/
]]# vim 项目名/应用名/urls.py			# 子路由文件
from django.urls import path
from . import views
urlpatterns = [path("index", views.视图函数名),	# http://IP:端口/应用名/index
]]# vim 项目名/应用名/views.py			# 视图文件
from django.shortcuts import render
from django.http import HttpResponse
def 视图函数名(request):return HttpResponse("这是音乐首页")
示例:音乐应用
]# vim mysite3/mysite3/urls.py			# 主路由文件
from django.urls import path, include	# 引入include
urlpatterns = [path("music/", include("music.urls")),# http://IP:端口/music/# 项目名/music/urls.py
]]# vim mysite3/music/urls.py			# 子路由文件
from django.urls import path
from . import views
urlpatterns = [path("index", views.index_view),	# http://IP:端口/music/index
]]# vim mysite3/music/views.py			# 视图文件
from django.shortcuts import render
from django.http import HttpResponse
def index_view(request):return HttpResponse("这是音乐首页")浏览器访问http://127.0.0.1:8000/music/index

示例:多应用

# 要求
- 创建sport应用并注册
- 创建news应用并注册
- 创建分布式路由系统- http://127.0.0.1:8000/sport/index,交给sport应用中的index_view()函数处理- http://127.0.0.1:8000/news/index,交给news应用中的index_view()函数处理]# cd mysite3
mysite3]# python3 manage.py startapp sport		# 创建应用目录
mysite3]# python3 manage.py startapp news		# 创建应用目录mysite3]# vim mysite3/settings.py				# 注册应用
INSTALLED_APPS = ['django.contrib.admin','django.contrib.auth','django.contrib.contenttypes','django.contrib.sessions','django.contrib.messages','django.contrib.staticfiles','music','news',		# 添加应用'sport',	# 添加应用
]mysite3]# vim mysite3/urls.py			# 主路由文件
from django.urls import path, include
from . import views
urlpatterns = [path("music/", include("music.urls")),path("sport/", include("sport.urls")),path("news/", include("news.urls")),
]mysite3]# vim sport/urls.py				# 子路由文件
from django.urls import path
from . import views
urlpatterns = [path("index", views.index_view),	# http://IP:端口/sport/index
]mysite3]# vim sport/views.py			# 视图文件
from django.shortcuts import render
from django.http import HttpResponse
def index_view(request):return HttpResponse("这是体育首页")mysite3]# vim news/urls.py				# 子路由文件
from django.urls import path
from . import views
urlpatterns = [path("index", views.index_view),	# http://IP:端口/news/index
]mysite3]# vim news/views.py			# 视图文件
from django.shortcuts import render
from django.http import HttpResponse
def index_view(request):return HttpResponse("这是新闻首页")浏览器访问http://127.0.0.1:8000/sport/index
浏览器访问http://127.0.0.1:8000/news/index

应用下的模板

概念与理解

  • 应用内部可以配置模板目录
    • 应用下手动创建templates文件夹
    • settings.py中开启应用模板功能
      • TEMPLATES配置项中的 APP_DIRS 值为 True 即可
  • 应用下templates和外层templates都存在时,Django得查找模板规则
    • 优先查找外层templates目录下的模板
    • 按 INSTALLED_APPS 配置下的应用顺序逐层查找

实验:在应用中配置模板文件

  • 应用(news)下手动创建 templates 文件夹

    外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  • 在 settings.py 中开启应用模板功能

    TEMPLATES = [{'BACKEND': 'django.template.backends.django.DjangoTemplates','DIRS': [os.path.join(BASE_DIR, "templates")],'APP_DIRS': True,  # 是否启用应用下的模板,默认为True
    
  • 在 mysite3/news/templates 下创建 index.html 模板文件,编写模板内容

    <!DOCTYPE html>
    <html lang="en">
    <head><meta charset="UTF-8"><title>新闻首页</title>
    </head>
    <body>
    我是新闻频道首页
    </body>
    </html>
    
  • 在 mysite3/news/views.py 中修改视图函数 index_view

    from django.shortcuts import render
    from django.http import HttpResponsedef index_view(request):# return HttpResponse("这是新闻首页")return render(request, "index.html")
    
  • 查看服务是否重启,浏览器访问:http://127.0.0.1:8000/news/index,查看模板加载是否成功

    外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  • 如果此时在外层的 templates 中也创建 index.html 文件,

    <!DOCTYPE html>
    <html lang="en">
    <head><meta charset="UTF-8"><title>首页</title>
    </head>
    <body>
    我是首页
    </body>
    </html>
    

    外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  • 查看服务是否重启,浏览器访问:http://127.0.0.1:8000/news/index,查看模板加载结果是否有冲突

    外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  • 如果此时在外层的 templates 中也创建 index.html 文件,经测试后,会优先找外层文件

  • 解决方式

  • 将应用中存储模板的路径改为:应用下—templates—应用名—index.html

    外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  • 在 mysite3/news/views.py 中修改视图函数 index_view

    def index_view(request):# return HttpResponse("这是新闻首页")return render(request, "news/index.html")  # 修改渲染模板路径,改为APP内部模板路径]# vim mysite3/news/templates/news/index.html
  • 看服务是否重启,浏览器访问:http://127.0.0.1:8000/news/index,查看模板加载结果

    外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

模型层

概念与理解

回顾 Django MTV

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传模型层:负责跟数据库中间进行通信

准备:Django配置MySQL


# 安装数据库服务并且创建数据库
]# yum -y install mariadb-server
]# systemctl start mariadb
]# systemctl enable mariadb
]# mysqladmin -u root password 
New password: 123456
Confirm new password: 123456
]# mysql -uroot -p123456
MariaDB [(none)]> CREATE DATABASE mysite3 DEFAULT CHARSET utf8;# Django项目配置mysql信息
]# vim mysite3/mysite3/settings.py
DATABASES = {'default': {'ENGINE': 'django.db.backends.mysql',  # 更改数据引擎'HOST': '127.0.0.1',  	# 数据库服务所在的主机地址'PORT': 3306  			# 端口号'USER': 'root',  		# 连接数据库的用户名'PASSWORD': '123456',  	# 连接数据库用户名的密码'NAME': 'mysite3',   	# 操作的数据库名称}
}# 测试:迁移数据库数据
]# python3 mysite3/manage.py migrateOperations to perform:Apply all migrations: admin, auth, contenttypes, sessionsRunning migrations:Applying contenttypes.0001_initial... OKApplying auth.0001_initial... OKApplying admin.0001_initial... OKApplying admin.0002_logentry_remove_auto_add... OKApplying admin.0003_logentry_add_action_flag_choices... OKApplying contenttypes.0002_remove_content_type_name... OKApplying auth.0002_alter_permission_name_max_length... OKApplying auth.0003_alter_user_email_max_length... OKApplying auth.0004_alter_user_username_opts... OKApplying auth.0005_alter_user_last_login_null... OKApplying auth.0006_require_contenttypes_0002... OKApplying auth.0007_alter_validators_add_error_messages... OKApplying auth.0008_alter_user_username_max_length... OKApplying auth.0009_alter_user_last_name_max_length... OKApplying auth.0010_alter_group_name_max_length... OKApplying auth.0011_update_proxy_permissions... OKApplying sessions.0001_initial... OK]# mysql -uroot -p123456 -e 'show tables from mysite3;'

什么是模型

不同后端数据库的使用命令不一致,因此,可以通过使用模型类,来使用一致的手段操作不同的后端数据库,避免后续项目更换数据库导致的修改工作。- 什么是模型- 模型是一个 Python 类,它是由 django.db.models.Model 派生出的子类- 一个模型类代表数据库中的一张数据表- 模型类中每一个类属性都代表数据库中的一个字段- 模型是数据交互的接口,是表示和操作数据库的方法和方式
- models.py- 模型类写在指定应用 app 的 models.py 模块中 

ORM框架

#### 定义ORM(Object Relational Mapping)即对象关系映射,它是一种程序技术,它允许你使用类和对象对数据库进行操作,从而避免通过SQL语句操作数据库#### 作用- 建立模型类和表之间的对应关系,允许我们通过面向对象的方式来操作数据库
- 根据设计的模型类生成数据库中的表格
- 通过简单的配置就可以进行数据库的切换#### 优点- 只需要面向对象编程,不需要面向数据库编写SQL脚本
- 对数据库的操作都转换成对类属性和方法的操作 
- 不用写各种数据库的SQL语句
- 实现了数据模型与数据库的解耦,屏蔽了不同数据库操作上的差异
- 不再关注用的是MySQL、Oracle或是其他数据库的内部细节
- 通过简单的配置就可以轻松切换数据库,而不需要修改代码#### 缺点- 对于复杂业务,使用成本较高
- 根据对象的操作转换成SQL语句,根据查询的结果转换成对象,在映射过程中由性能损失
映射图

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

实验:添加模型类

此示例为添加一个 bookstore_book 数据表来存放图书馆中数目的信息

  • 添加一个 bookstore 的 app

    • python3 manage.py startapp bookstore
  • 添加模型类并注册 app

    # settings.py
    INSTALLED_APPS = [# ......'bookstore'
    ]
    
  • 模型类代码示例:

    # file: bookstore/models.py
    from django.db import modelsclass Book(models.Model):      # Book类继承models.Model类# 通过属性来指定表的字段。CharField、DecimalField...指定表字段的类型title = models.CharField("书名", max_length=50, default="")price = models.DecimalField("定价", max_digits=7, decimal_places=2, default=0.0)# 最大7位数字(整数+小数),小数部分2位 
    
  • 数据库迁移

    • 迁移是 Django 同步对模型所做修改(添加模型,删除模型等)到数据库模式的方式
    • 生成迁移文件—执行 python3 manage.py makemigrations
    • 将应用下的 models.py 文件生成一个中间文件,并保存在 migrations 文件夹中
    (testenv) [root@localhost mysite3]# python3 manage.py makemigrations
    Migrations for 'bookstore':bookstore/migrations/0001_initial.py- Create model Book
    
    • 执行迁移脚本程序—执行 python3 manage.py migrate
    • 执行迁移程序实现数据迁移,将每个已注册应用下的 migrations 文件夹中的中间文件同步回数据库
    (testenv) [root@localhost mysite3]# python3 manage.py migrate
    Operations to perform:Apply all migrations: admin, auth, bookstore, contenttypes, sessions
    Running migrations:Applying bookstore.0001_initial... OK
    
  • 查看数据库,验证指定表是否创建成功

    (testenv) [root@localhost mysite3]# mysql -uroot -p123456
    MariaDB [(none)]> USE mysite3;
    MariaDB [mysite3]> SHOW TABLES;
    +----------------------------+
    | Tables_in_mysite3          |
    +----------------------------+
    | auth_group                 |
    | auth_group_permissions     |
    | auth_permission            |
    | auth_user                  |
    | auth_user_groups           |
    | auth_user_user_permissions |
    | bookstore_book             |
    | django_admin_log           |
    | django_content_type        |
    | django_migrations          |
    | django_session             |
    +----------------------------+
    MariaDB [mysite3]> DESC bookstore_book;
    +-------+--------------+------+-----+---------+----------------+
    | Field | Type         | Null | Key | Default | Extra          |
    +-------+--------------+------+-----+---------+----------------+
    | id    | int(11)      | NO   | PRI | NULL    | auto_increment |
    | title | varchar(50)  | NO   |     | NULL    |                |
    | price | decimal(7,2) | NO   |     | NULL    |                |
    +-------+--------------+------+-----+---------+----------------+
    
创建模型类流程
创建应用

使用 python3 manage.py startapp 应用名称 的方式创建应用,然后要及时的在 settings.py 文件中进行注册

在应用下的models.py中编写模型类

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  • 模型类的类名是数据表名的一部分,建议类名首字母大写
  • 类属性名,此名称将作为数据表的字段名
  • 字段类型用来映射到数据表中的字段的类型
  • 字段选项为这些字段提供附加的参数信息
迁移同步 makemigrations & migrate
模型类修改

任何关于表结构的修改,务必在对应模型类上修改,例:为 bookstore_book 表添加一个名为 info 的字段,类型是 varchar(100),解决方案:

  • 模型类中添加对应类属性
  • 执行数据库迁移
字段类型
BooleanField()CharField()
数据库类型:tinyint(1)数据库类型:varchar
编程语言中:使用True或False来表示值注意:必须要指定max_length参数值
在数据库中:使用1或0来表示具体的值
DateField()DateTimeField()
数据库类型:date 作用:表示日期数据库类型:datetime
参数(以下参数只能三选一)作用:表示日期和时间
1.auto_now:每次保存对象时,自动设置该字段为当前时间参数同DateField
2.auto_now_add:当对象第一次被创建时自动设置当前时间FloatField()
注意:1和2两个选项取值范围(True/False)数据库类型:double
3.default:设置当前时间(取值:字符串格式时间,如:2019-01-01)编程语言中和数据库中都使用小数表示值
DecimalField()IntergerField()
数据库类型:decimal(x, y)数据库类型:int
编程语言中和数据库中:使用小数表示编程语言和数据库中使用字符串
参数:EmailField()
1.max_digits:位数总数,包括小数点后的位数,该值必须大于等于decimal_places数据库类型:varchar
2.decimal_places:小数点后的数字数量编程语言和数据库中使用字符串
字段选项
字段选项,指定创建的列的额外信息,允许出现多个字段选项,多个选项之间使用,隔开- primary_key- 如果设置为True,表示该列为主键,如果指定一个字段为主键,则此数据库不会创建id字段- null- 如果设置为True,表示该列值允许为空- 默认为 False,如果此选项为 False,建议加入 defalut 选项来设置默认值- db_column- 指定列的名称,如果不指定则采用属性名作为列名- verbose_name- 设置此字段在 admin 界面上的显示名称- 字段选项样例![1679537629179](./orm01.assets/1679537629179.png)- default- 设置所在列的默认值,如果字段选项 null=False 建议添加此选项- db_index- 如果设置为 True,表示为该列增加索引- unique- 如果设置为 True,表示该字段在数据库中的值必须是唯一的
模型类-Meta类

使用内部Meta类来给模型赋予属性,Meta类下有很多内建的类属性,可对模型类做一些控制

示例:

练习:修改模型类
  • 模型类-Book 表名 book
    • title - CharField(50)–书名 唯一
    • pub–CharField(100) - 出版社 非空
    • price–DecimalField – 图书定价 总位数7/小数点2位
    • market_price – 图书零售价 总位数7/小数点2位
  • 模型类-Author 表名 author
    • name–CharField(11) – 姓名 非空
    • age – IntegerField – 年龄 默认值为1
    • email – EmailField – 邮箱 允许为空

解决方式

  • 修改模型类—bookstore/models.py

    # file: bookstore/models.py
    from django.db import modelsclass Book(models.Model):title = models.CharField("书名", max_length=50, default="", unique=True)pub = models.CharField("出版社", max_length=50, default="")price = models.DecimalField("定价", max_digits=7, decimal_places=2, default=0.0)market_price = models.DecimalField("零售价", max_digits=7, decimal_places=2, default=0.0)class Meta:# 设置表名。默认表名:应用名_模型类名db_table = "book"class Author(models.Model):name = models.CharField("姓名", max_length=11)age = models.IntegerField("年龄", default=1)email = models.EmailField("邮箱", null=True)class Meta:db_table = "author"
    
  • 数据迁移

    (testenv) [root@localhost mysite3]# python3 manage.py makemigrations
    (testenv) [root@localhost mysite3]# python3 manage.py migrate
    
  • 数据库检测

    (testenv) [root@localhost mysite3]# mysql -uroot -p123456
    MariaDB [(none)]> USE mysite3;
    MariaDB [mysite3]> SHOW TABLES;
    | author                     |
    | book                       |MariaDB [mysite3]> DESC author;
    +-------+--------------+------+-----+---------+----------------+
    | Field | Type         | Null | Key | Default | Extra          |
    +-------+--------------+------+-----+---------+----------------+
    | id    | int(11)      | NO   | PRI | NULL    | auto_increment |
    | name  | varchar(11)  | NO   |     | NULL    |                |
    | age   | int(11)      | NO   |     | NULL    |                |
    | email | varchar(254) | YES  |     | NULL    |                |
    +-------+--------------+------+-----+---------+----------------+MariaDB [mysite3]> DESC book;
    +--------------+--------------+------+-----+---------+----------------+
    | Field        | Type         | Null | Key | Default | Extra          |
    +--------------+--------------+------+-----+---------+----------------+
    | id           | int(11)      | NO   | PRI | NULL    | auto_increment |
    | title        | varchar(50)  | NO   | UNI | NULL    |                |
    | price        | decimal(7,2) | NO   |     | NULL    |                |
    | market_price | decimal(7,2) | NO   |     | NULL    |                |
    | pub          | varchar(50)  | NO   |     | NULL    |                |
    +--------------+--------------+------+-----+---------+----------------+
    
常见问题处理

问题1:当执行 python3 manage.py makemigrations 出现如下迁移错误时的处理方法:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

错误原因

  • 当对模型类新添加一个字段时可能出现如下错误
  • 原理是添加新字段后,数据库不知道原来已有数据对于新建字段该如何赋值,所以新增字段时务必添加default默认值

处理方法

  • 选择1:则会shell中,手动输入一个默认值
  • 选择2(推荐):退出当前生成迁移文件过程,修改models.py,新增一个 default=xxx 的缺省值

问题2:数据库的迁移文件混乱解决办法

  • 数据库中django_migrations表记录了migrate的全过程,项目各应用中migrate文件应与之对应否则migrate会报错

解决方案

  • 删除所有migrations里所有的000?_xxxx.py(init.py除外)
  • 删除数据库
    • sql> drop database 自定义项目数据库;
  • 重新创建数据库
    • sql>CREATE DATABASE自定义项目数据库 DEFAULT CHARSET utf8;
  • 重新生成migrations里所有的 000?_xxx.py
    • python3 manage.py makemigrations
  • 重新更新数据库
    • python3 manage.py migrate
ORM基本操作
ORM操作

基本操作包括增删改查,即(CRUD操作)

CRUD是指在做计算处理时的增加(create),读取查询(read),更新(update)和删除(delete)

ORM CRUD 核心 -> 模型类.管理器对象

管理器对象

每个继承自models.Model的模型类,都会有一个objects对象被同样继承下来,这个对象叫做管理器对象,数据库的增上改查可以通过模型的管理器实现

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

创建数据

Django ORM 使用一种直观的方式把数据库表中的数据表示成Python对象,创建数据中每一条记录就是创建一个数据对象

方案1

MyModel.objects.create(属性1=值1,属性2=值2,…)

成功:返回创建好的实体对象

失败:抛出异常

**方案2:**创建MyModel实例对象,并调用save()进行保存

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Django Shell
  • 在 Django 中提供了一种交互式操作项目叫做 Django Shell,能够在交互模式用项目工程代码执行相应的操作
  • 利用 Django Shell 可以代替编写 view 视图层的代码进行直接操作
  • 注意:项目代码发生变化时,需要重新进入Django Shell
  • 启动方式:
    • python3 manage.py shell
实验:使用 Django Shell 添加数据
  • 启动 Django Shell(代码发生变化需要重新进入):

    (testenv) [root@localhost mysite3]# python3 manage.py shell
    >>> 
    
  • 测试 方案1 后查看数据库:

    # Django Shell
    >>> from bookstore.models import Book
    >>> Book.objects.create(title='Python', pub='清华大学出版社', price=20, market_price=25)
    <Book: Book object (1)>
    # mysql
    MariaDB [mysite3]> select * from book;
    +----+--------+-------+--------------+-----------------------+
    | id | title  | price | market_price | pub                   |
    +----+--------+-------+--------------+-----------------------+
    |  1 | Python | 20.00 |        25.00 | 清华大学出版社          |
    +----+--------+-------+--------------+-----------------------+
    
  • 测试 方案2 后查看数据库:

    # Django Shell
    >>> from bookstore.models import Book
    >>> b2 = Book(title='Django', pub='清华大学出版社', price=70, market_price=75)
    >>> b2.save()
    # mysql
    MariaDB [mysite3]> select * from book;
    +----+--------+-------+--------------+-----------------------+
    | id | title  | price | market_price | pub                   |
    +----+--------+-------+--------------+-----------------------+
    |  1 | Python | 20.00 |        25.00 | 清华大学出版社          |
    |  2 | Django | 70.00 |        75.00 | 清华大学出版社          |
    +----+--------+-------+--------------+-----------------------+
    

静态文件

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

相关文章:

orm01

静态文件处理 静态文件&#xff1a;如&#xff1a;图片、音频、视频、css、js等静态文件的相关配置也在 项目名/项目名/settings.py 文件中进行配置 - 配置静态文件的访问路径STATIC_URL- 功能&#xff1a;通过哪个 url 地址找静态文件- 默认配置&#xff1a;STATIC_URL /sta…...

Maven 测试和单元测试介绍

一、测试介绍 二、单元测试 1&#xff09;介绍 2&#xff09;快速入门 添加依赖 <dependencies><!-- junit依赖 --><dependency><groupId>org.junit.jupiter</groupId><artifactId>junit-jupiter</artifactId><version>5.9…...

Postman接口测试03|执行接口测试、全局变量和环境变量、接口关联、动态参数、断言

目录 七、Postman 1、安装 2、postman的界面介绍 八、Postman执行接口测试 1、请求页签 3、响应页签 九、Postman的环境变量和全局变量 1、创建环境变量和全局变量可以解决的问题 2、postman中的操作-全局变量 1️⃣手动设置 2️⃣代码设置 3️⃣界面获取 4️⃣代…...

UE5 丧尸类杂兵的简单AI

A、思路 1、关卡初始化时&#xff0c;自动产生随机巡逻点&#xff0c;小兵到达后&#xff0c;去另一个随机巡逻点。 2、加入视力&#xff0c;发现主角后&#xff0c;不再巡逻&#xff0c;而开始追击主角并攻击。条件循环。 3、加入听力。主角的奔跑与射击会产生噪音&#xf…...

Linux字符设备驱动开发的三种方式(分析+对比+示例)

文章目录 一. 字符设备的驱动方法二. 三种方法的对比三. 开发环境四. 代码示例1. 传统设备驱动模型2. 总线设备驱动模型3. 设备树驱动模型 五. 相关链接 一. 字符设备的驱动方法 字符设备驱动 是指在I/O传输过程中以字节流进行读写操作的设备。典型的如LCD、蜂鸣器、SPI、触摸屏…...

C++设计模式之行为型模式概述,它们的目的与特点

行为型设计模式需要解决的问题 行为型设计模式主要关注对象之间的责任分配和交互。它们解决的问题包括&#xff1a; 对象之间的通信&#xff1a;如何让对象之间高效地通信&#xff0c;同时保持松耦合。算法的封装与复用&#xff1a;如何将算法或行为封装起来&#xff0c;使其…...

把Huggingface下载的arrow数据集转化为json格式

Arrow2json 使用默认的Huggingface路径 以allenai/tulu-3-sft-mixture数据集为例。 使用load_dataset即可&#xff1a; from datasets import load_dataset# 加载数据集 dataset load_dataset("allenai/tulu-3-sft-mixture")# 指定保存路径 output_dir "~/…...

复习打卡大数据篇——Hadoop YARN

目录 &#xff11;.什么是yarn &#xff12;.yarn的三大角色 &#xff13;.任务&#xff08;MR&#xff09;提交到YARN运行流程 4. 调度器Scheduler 5.YARN HA 高可用 &#xff11;.什么是yarn YARN&#xff08;Yet Another Resource Negotiator&#xff09;是一个资源管…...

fpga系列 HDL:ModelSim显示模拟波形以及十进制格式数值

FPGA中使用数字滤波器时&#xff0c;可通过观察模拟波形更好地查看滤波效果。可以通过ModelSim中的波形格式设置来实现更直观的波形显示。 右键波形->Format-> Analog 效果 不同的数值格式显示&#xff1a;右键波形->Radix-> Decimal 效果 示例代码 ver…...

Linux 基本指令

目录 1.常见指令 1.1 ls指令 1.2 pwd指令 1.3 cd指令 1.4 touch指令 1.5 mkdir指令 1.6 rm和rmdir指令 1.7 man指令 1.8 cp指令 1.9 mv指令 ​编辑 1.10 cat指令 1.11 more指令 1.12 less指令 1.13 head指令 1.14.tail指令 1.15 时间相关的指令 1.16 cal…...

GO语言基础面试题

一、字符串和整型怎么相互转换 1、使用 strconv 包中的函数 FormatInt 、ParseInt 等进行转换 2、转换10进制的整形时&#xff0c;可以使用 strconv.Atoi、strconv.Itoa&#xff1a; Atoi是ParseInt(s, 10, 0) 的简写 Itoa是FormatInt(i, 10) 的简写 3、整形转为字符型时&#…...

要查询 `user` 表中 `we_chat_subscribe` 和 `we_chat_union_id` 列不为空的用户数量

文章目录 1、we_chat_subscribe2、we_chat_union_id 1、we_chat_subscribe 要查询 user 表中 we_chat_subscribe 列不为空的用户数量&#xff0c;你可以使用以下 SQL 查询语句&#xff1a; SELECT COUNT(*) FROM user WHERE we_chat_subscribe IS NOT NULL;解释&#xff1a; …...

小程序基础 —— 10 如何调试小程序代码

如何调试小程序代码 在进行项目开发的时候&#xff0c;不可避免需要进行调试&#xff0c;那么如何调试小程序呢&#xff1f; 打开微信开发者工具后&#xff0c;有一个模拟器&#xff0c;通过模拟器能够实时预览自己写的页面&#xff0c;如下&#xff1a; 在上部工具栏中有一个…...

Vue项目如何设置多个静态文件;如何自定义静态文件目录

Vite实现方案 安装插件 npm i vite-plugin-static-copy在vite.config.ts引入 import { viteStaticCopy } from vite-plugin-static-copy配置 plugins: [viteStaticCopy({targets: [{src: "要设置的静态文件目录的相对路径 相对于vite.config.ts的", dest: ./, // …...

CentOS Stream 9 安装 JDK

安装前检查 java --version注&#xff1a;此时说明已安装过JDK&#xff0c;否则为未安装。如若已安装过JDK可以跳过安装步骤直接使用&#xff0c;或者先卸载已安装的JDK版本重新安装。 安装JDK 官网下载地址&#xff1a;https://www.oracle.com/java/technologies/downloads…...

前端(htmlcss)

前端页面 Web页面 PC端程序页面 移动端APP页面 ... HTML页面 HTML超文本标记页面 超文本&#xff1a;文本&#xff0c;声音&#xff0c;图片&#xff0c;视频&#xff0c;表格&#xff0c;链接 标记&#xff1a;由许多标签组成 HTML页面运行到浏览器上面 vscode便捷插件使用 vs…...

py打包工具

pyinstaller 安装 大佬文档参考 pip install pyinstallerpyinstaller 参数 -i 给应用程序添加图标 -F 只生成一个exe格式的文件 -D 创建一个目录&#xff0c;包含exe文件&#xff0c;但会依赖很多文件&#xff08;默认选项&#xff09; -c 有黑窗口 -w 去掉黑窗口pyinstalle…...

华为OD E卷(100分)39-最长子字符串的长度(二)

前言 工作了十几年&#xff0c;从普通的研发工程师一路成长为研发经理、研发总监。临近40岁&#xff0c;本想辞职后换一个相对稳定的工作环境一直干到老, 没想到离职后三个多月了还没找到工作&#xff0c;愁肠百结。为了让自己有点事情做&#xff0c;也算提高一下自己的编程能力…...

Selenium+Java(21):Jenkins发送邮件报错Not sent to the following valid addresses解决方案

问题现象 小月妹妹近期在做RobotFrameWork自动化测试,并且使用Jenkins发送测试邮件的时候,发现报错Not sent to the following valid addresses,明明各个配置项看起来都没有问题,但是一到邮件发送环节,就是发送不出去,而且还不提示太多有用的信息,急的妹妹脸都红了,于…...

JSON结构快捷转XML结构API集成指南

JSON结构快捷转XML结构API集成指南 引言 在当今的软件开发世界中&#xff0c;数据交换格式的选择对于系统的互操作性和效率至关重要。JSON&#xff08;JavaScript Object Notation&#xff09;和XML&#xff08;eXtensible Markup Language&#xff09;是两种广泛使用的数据表…...

React---day3

React 2.5 jsx的本质 jsx 仅仅只是 React.createElement(component, props, …children) 函数的语法糖。所有的jsx最终都会被转换成React.createElement的函数调用。 createElement需要传递三个参数&#xff1a; 参数一&#xff1a;type 当前ReactElement的类型&#xff1b;…...

全面解析:npm 命令、package.json 结构与 Vite 详解

全面解析&#xff1a;npm 命令、package.json 结构与 Vite 详解 一、npm run dev 和 npm run build 命令解析 1. npm run dev 作用&#xff1a;启动开发服务器&#xff0c;用于本地开发原理&#xff1a; 启动 Vite 开发服务器提供实时热更新&#xff08;HMR&#xff09;功能…...

11.4java语言执行浅析4

编译成字节码&#xff08;.class 文件&#xff09; 使用 javac 命令将源代码编译为 Java 字节码&#xff08;bytecode&#xff09; 它不是机器码&#xff0c;而是 JVM 能理解的中间语言&#xff08;字节码&#xff09;&#xff0c;具有平台无关性。 编译过程简要&#xff1…...

Android之ListView

1&#xff1a;简单列表(ArrayAdapter) 1&#xff1a;运行的结果&#xff1a; 2&#xff1a;首先在MyListView里面创建一个按钮&#xff0c;点击的时候进行跳转。 这里让我吃惊的是&#xff0c;Button里面可以直接设置onClick .java里面的方法。 也即是点击这个按钮之后就会去…...

LVS-NAT 负载均衡群集

目录 简介 一、LVS 与群集技术基础 1.1 群集技术概述 1.2 负载均衡群集的分层结构 1.3 负载均衡工作模式 二、LVS 虚拟服务器核心组件与配置 2.1 LVS 内核模块与管理工具 2.2 负载调度算法解析 2.3 ipvsadm 管理工具实战 三、NFS 共享存储服务配置 3.1 NFS 服务基础…...

Python实现P-PSO优化算法优化BP神经网络分类模型项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档&#xff09;&#xff0c;如需数据代码文档可以直接到文章最后关注获取。 1.项目背景 随着人工智能技术的快速发展&#xff0c;神经网络在分类任务中展现了强大的性能。BP&#xff08;Back Propagation&…...

【linux】linux进程概念(四)(环境变量)超详细版

小编个人主页详情<—请点击 小编个人gitee代码仓库<—请点击 linux系列专栏<—请点击 倘若命中无此运&#xff0c;孤身亦可登昆仑&#xff0c;送给屏幕面前的读者朋友们和小编自己! 目录 前言一、基本概念二、认识常见的几个环境变量echo $ 查看某个环境变量env 显示…...

WPF的交互核心:命令系统(ICommand)

命令系统&#xff08;ICommand&#xff09; 1 RelayCommand实现2 CanExecute控制按钮可用性3 参数传递&#xff08;CommandParameter&#xff09;3.1 静态参数绑定&#xff1a;3.2 动态参数绑定&#xff1a;3.3 复杂对象参数&#xff1a; 4 异步命令实现5 常见问题排查 WPF的命…...

47道ES67高频题整理(附答案背诵版)

1.ES5、ES6&#xff08;ES2015&#xff09;有什么区别? ES5&#xff08;ECMAScript 5&#xff09;和ES6&#xff08;也称为ECMAScript 2015&#xff09;是JavaScript语言的两个版本&#xff0c;它们之间有一些重要的区别和改进&#xff1a; let 和 const 关键字&#xff1a; …...

如何将vue2使用npm run build打包好的文件上传到服务器

要将 Vue 2 项目打包并部署到服务器上&#xff0c;并使用 Nginx 作为 Web 服务器&#xff0c;可以按照以下步骤操作&#xff1a; 1. 打包 Vue 2 项目 首先&#xff0c;确保你的 Vue 2 项目已经开发完成&#xff0c;并且可以在本地正常运行。然后使用以下命令进行打包&#xf…...