Python 自动化(十六)静态文件处理

准备工作

将不同day下的代码分目录管理,方便后续复习查阅

(testenv) [root@localhost projects]# ls
day01  day02
(testenv) [root@localhost projects]# mkdir day03
(testenv) [root@localhost projects]# cd day03
(testenv) [root@localhost day03]# django-admin startproject mysite3
(testenv) [root@localhost day03]# ls
mysite3  # 今日在mysite3项目进行操作

使用 Pycharm 打开新项目 mysite3,并设置解释器为 testenv 虚拟环境

修改基础配置 settings.py

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    # 'django.middleware.csrf.CsrfViewMiddleware',  # 注释掉 csrf
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
# ......
TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS':[os.path.join(BASE_DIR,"templates")],  #配置模板目录,项目根目录创建templates
# ......
LANGUAGE_CODE = 'zh-Hans'  # 配置语言支持
TIME_ZONE = 'Asia/Shanghai'  # 配置时区

静态文件处理

什么是静态文件

如:图片、音频、视频、css、js等

 

静态文件配置

静态文件的相关配置也在 settings.py 文件中进行配置

  • 配置静态文件的 访问路径【该配置默认存在】

    • 功能:通过哪个 url 地址找静态文件
    • STATIC_URL = '/static/'
    • 说明:指定访问静态文件时是需要通过 /static/xxx 或 http://127.0.0.18000/static/xxx 获取的,xxx表示具体的静态资源位置
  • 配置静态文件的存储路径 STATICFILES_DIRS

    • STATICFILES_DIRS:保存的是静态文件在服务器端的存储位置,例如:

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

  • 修改配置文件—settings.py 文件,添加指定参数配置

STATIC_URL = '/static/'
STATICFILES_DIRS = (os.path.join(BASE_DIR, 'static'),)  # 注意元组中的逗号

在项目根目录创建 static文件夹

复制一张图放入 image 文件夹,图片可自行寻找(本地或网络均可)

 mysite3项目/mysite3 创建 views.py 文件,在该文件中编写指定视图函数

from django.shortcuts import render

def test_static(request):
    return render(request, "test_static.html")

mysite3/templates 中创建 test_static.html 模板文件

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>p
<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>

修改 mysite3/mysite3/urls.py 文件,添加路由配置

from . import views

urlpatterns = [
    path('admin/', admin.site.urls),
    ###day03###
    path("test_static", views.test_static),
]
  • 查看服务是否重启,浏览器访问:http://127.0.0.1:8000/test_static,查看模板加载是否成功

 修改 mysite3/templates 中的 test_static.html 模板文件,添加 django 加载静态文件的方式

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<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,查看模板加载是否成功

 查看网页源代码,django方式加载的图片url路径默认是相对显示的方式

 修改 settings.py 文件中的 STATIC_URL 参数

STATIC_URL = '/statics/'  # 多了个s

重启服务后再次刷新页面,只有 {% static 'xxx' %} 的方式可以显示

 

  • 通过查看网页源代码,观察图片地址,发现带有标签的img标签图片地址会更动态

应用

理解与概念

应用在Django项目中是一个独立的业务模块,可以包含自己的路由,视图,模板,模型

 

实验:创建应用

  • 用 manage.py 中的子命令 startapp 创建应用文件夹

(testenv) [root@localhost mysite3]# python3 manage.py startapp music
(testenv) [root@localhost mysite3]# ls
db.sqlite3  manage.py  music  mysite3  static  templates

  settings.pyINSTALLED_APPS 列表中配置安装此应用

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'music',  # 安装应用
]

应用内部结构

  • migrations文件夹

    • 保存数据迁移的中间文件
  • __init__.py

    • 应用子包的初始化文件
  • admin.py

    • 应用的后台管理配置文件
  • apps.py

    • 应用的属性配置文件
  • models.py

    • 与数据库相关的模型映射文件
  • tests.py

    • 应用的单元测试文件
  • views.py

    • 定义视图处理函数的文件

分布式路由

概念与理解

Django中,主路由配置文件(urls.py)可以不处理用户具体路由,主路由配置文件可以做请求的分发(分布式请求处理)。具体的请求可以由各自的应用来进行处理。

 

配置分布式路由

步骤1:主路由中调用include函数

语法: include(‘app名字.url模块名’) 作用: 用于将当前路由转到各个应用的路由配置文件的urlpatterns进行分布式处理

步骤2:应用下配置urls.py

应用下手动创建urls.py文件,内容结构同主路由完全一致

实验:配置分布式路由

  • 修改 mysite3/mysite3/urls.py 主路由文件,修改路由配置

  • from django.urls import path, include
    from . import views
    
    urlpatterns = [
        path('admin/', admin.site.urls),
        ###day03###
        path("test_static", views.test_static),
        path("music/", include("music.urls")),
    ]

    mysite3/music 创建子路由 urls.py 文件,修改路由配置

  • from django.urls import path
    from . import views
    
    urlpatterns = [
        # http://127.0.0.1:8000/music/index
        path("index", views.index_view),
    ]

    修改 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()函数处理

解题过程

  • 用 manage.py 中的子命令 startapp 创建应用文件夹

  • (testenv) [root@localhost mysite3]# python3 manage.py startapp sport
    (testenv) [root@localhost mysite3]# python3 manage.py startapp news
    (testenv) [root@localhost mysite3]# ls
    db.sqlite3  manage.py  music  mysite3  news  sport  static  templates

    settings.pyINSTALLED_APPS 列表中配置安装此应用

  • INSTALLED_APPS = [
        'django.contrib.admin',
        'django.contrib.auth',
        'django.contrib.contenttypes',
        'django.contrib.sessions',
        'django.contrib.messages',
        'django.contrib.staticfiles',
        'music',
        'news',
        'sport',
    ]

    修改 mysite3/mysite3/urls.py 主路由文件,修改路由配置

  • from django.urls import path, include
    from . import views
    
    urlpatterns = [
        path('admin/', admin.site.urls),
        ###day03###
        path("test_static", views.test_static),
        path("music/", include("music.urls")),
        path("sport/", include("sport.urls")),
        path("news/", include("news.urls")),
    ]

    mysite3/sport 创建子路由 urls.py 文件,修改路由配置

  • from django.urls import path
    from . import views
    
    urlpatterns = [
        # http://127.0.0.1:8000/sport/index
        path("index", views.index_view),
    ]

    修改 mysite3/sport/views.py 视图文件,添加指定视图函数

  • from django.shortcuts import render
    from django.http import HttpResponse
    
    def index_view(request):
        return HttpResponse("这是体育首页")

    mysite3/news 创建子路由 urls.py 文件,修改路由配置

  • from django.urls import path
    from . import views
    
    urlpatterns = [
        # http://127.0.0.1:8000/news/index
        path("index", views.index_view),
    ]

    修改 mysite3/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即可,默认为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 HttpResponse

def 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,查看模板加载结果是否有冲突

ORM框架

定义

ORM(Object Relational Mapping)即对象关系映射,它是一种程序技术,它允许你使用类和对象对数据库进行操作,从而避免通过SQL语句操作数据库

作用

  • 如果此时在外层的 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内部模板路径

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

  • 模型层

    概念与理解

    回顾 Django MTV

  • 模型层:负责跟数据库中间进行通信

    实验:Django配置MySQL

  • 安装数据库服务并且创建数据库

  • (testenv) [root@localhost mysite3]# yum -y install mariadb-server
    (testenv) [root@localhost mysite3]# systemctl start mariadb
    (testenv) [root@localhost mysite3]# systemctl enable mariadb
    (testenv) [root@localhost mysite3]# mysqladmin password 
    New password: 123456
    Confirm new password: 123456
    (testenv) [root@localhost mysite3]# mysql -uroot -p123456
    MariaDB [(none)]> CREATE DATABASE mysite3 DEFAULT CHARSET utf8;

    修改 settings.py 文件

  • DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.mysql',  # 更改数据引擎
            'NAME': 'mysite3',   # 操作的数据库名称
            'USER': 'root',  # 连接数据库的用户名
            'PASSWORD': '123456',  # 连接数据库用户名的密码
            'HOST': '127.0.0.1',  # 数据库服务所在的主机地址
            'PORT': 3306  # 端口号
        }
    }

    测试—python3 manage.py migrate

  • (testenv) [root@localhost mysite3]# python3 manage.py migrate
    Operations to perform:
      Apply all migrations: admin, auth, contenttypes, sessions
    Running migrations:
      Applying contenttypes.0001_initial... OK
      Applying auth.0001_initial... OK
      Applying admin.0001_initial... OK
      Applying admin.0002_logentry_remove_auto_add... OK
      Applying admin.0003_logentry_add_action_flag_choices... OK
      Applying contenttypes.0002_remove_content_type_name... OK
      Applying auth.0002_alter_permission_name_max_length... OK
      Applying auth.0003_alter_user_email_max_length... OK
      Applying auth.0004_alter_user_username_opts... OK
      Applying auth.0005_alter_user_last_login_null... OK
      Applying auth.0006_require_contenttypes_0002... OK
      Applying auth.0007_alter_validators_add_error_messages... OK
      Applying auth.0008_alter_user_username_max_length... OK
      Applying auth.0009_alter_user_last_name_max_length... OK
      Applying auth.0010_alter_group_name_max_length... OK
      Applying auth.0011_update_proxy_permissions... OK
      Applying sessions.0001_initial... OK

    什么是模型

  • 什么是模型

    • 模型是一个 Python 类,它是由 django.db.models.Model 派生出的子类
    • 一个模型类代表数据库中的一张数据表
    • 模型类中每一个类属性都代表数据库中的一个字段
    • 模型是数据交互的接口,是表示和操作数据库的方法和方式
  • models.py

    • 模型类写在指定应用 app 的 models.py 模块中
  • 建立模型类和表之间的对应关系,允许我们通过面向对象的方式来操作数据库
  • 根据设计的模型类生成数据库中的表格
  • 通过简单的配置就可以进行数据库的切换
缺点

对于复杂业务,使用成本较高 根据对象的操作转换成SQL语句,根据查询的结果转换成对象,在映射过程中由性能损失

映射图

实验:添加模型类

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

  • 添加一个 bookstore 的 app

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

  • # settings.py
    INSTALLED_APPS = [
        # ......
        'bookstore'
    ]

    模型类代码示例:

  • # file: bookstore/models.py
    from django.db import models
    
    class Book(models.Model):
        title = models.CharField("书名", max_length=50, default="")
        price = models.DecimalField("定价", max_digits=7, decimal_places=2, default=0.0)

    数据库迁移

  • 迁移是 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 界面上的显示名称
  • 字段选项样例

  • 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 – 邮箱 允许为空

解决方式

处理方法

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

解决方案

ORM基本操作
ORM操作

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

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

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

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

  • # file: bookstore/models.py
    from django.db import models
    
    class 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 的缺省值
  • 数据库中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
管理器对象

每个继承自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;
    MariaDB [mysite3]> select * from book;
    +----+--------+-------+--------------+-----------------------+
    | id | title  | price | market_price | pub                   |
    +----+--------+-------+--------------+-----------------------+
    |  1 | Python | 20.00 |        25.00 | 清华大学出版社          |
    |  2 | Django | 70.00 |        75.00 | 清华大学出版社          |
    +----+--------+-------+--------------+-----------------------+

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/112738.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

windows docker desktop 更换镜像 加速

最近 docker hub 访问不了; 经过研究 可以通过添加 代理镜像网址 添加代理服务器的方式 实现完美访问 1添加镜像网站 修改成国内镜像地址就能享受到飞一般的速度&#xff0c;但有一个问题&#xff0c;部分站点镜像不全或者镜像比较老&#xff0c;建议使用多个镜像站。 https…

【Tomcat Servlet】如何在idea上部署一个maven项目?

目录 1.创建项目 2.引入依赖 3.创建目录 4.编写代码 5.打包程序 6.部署项目 7.验证程序 什么是Tomcat和Servlet? 以idea2019为例&#xff1a; 1.创建项目 1.1 首先创建maven项目 1.2 项目名称 2.引入依赖 2.1 网址输入mvnrepository.com进入maven中央仓库->地址…

中期科技:智慧公厕打造智能化城市设施,提升公共厕所管理与服务体验

智慧公厕是利用先进的技术和创新的解决方案来改进公厕的设施和管理。借助物联网、互联网、5G/4G通信、人工智能、大数据、云计算等新兴技术的集成&#xff0c;智慧公厕具备了一系列令人惊叹的应用功能。从监测公厕内部人体活动状态、人体存在状态&#xff0c;到空气质量情况、环…

按顺序判断对象a和b中第一个不同之处ax和bx【1】ax是否小于等于bx【2】不同处ax是否为空operator.le()

【小白从小学Python、C、Java】 【计算机等考500强证书考研】 【Python-数据分析】 按顺序判断对象a和b中 第一个不同之处ax和bx 【1】ax是否小于等于bx 【2】不同处ax是否为空 operator.le() [太阳]选择题 下列代码执行输出结果为True的个数为? import operator pr…

【ELFK】之Filebeat

一、Filebeat介绍 1、Filebeat是什么&#xff1f; Filebeat适用于转发和集中数据的轻量级传送工具&#xff0c;Filebeat监视了指定的日志文件或位置&#xff0c;收集日志事件&#xff0c;并将他们转发到Elasticsearch或Logstash进行索引。 **Filebeat的工作方式&#xff1a;*…

@reduxjs/toolkit配置react-redux解决createStore或将在未来被淘汰警告

通常 我们用redux都需要通过 createStore 但目前 你去用它 基本都会被划线 甚至有点厉害的的编辑器 他会直接告诉你这个东西基本快被弃用了 这个应该大家都知道 最好不要用已经被明确未来或弃用的语法 因为一旦弃用这个系统就需要维护 而且说 一般会被淘汰的语法 本身也就是有…

Python的网络编程一篇学透,使用Socket打开新世界

目录 1.网络概念 2.网络通信过程 2.1.TCP/IP 2.2.网络协议栈架构 3.TCP/IP介绍 3.1.ip地址 3.2.端口号 3.3.域名 4.Python网络编程 4.1.TCP/IP 4.2.socket的概念 4.3.Socket类型 4.4.Socket函数 4.5.Socket编程思想 5.客户端与服务器 5.1.tcp客户端 6.网络调试…

C# OpenCvSharp DNN 部署L2CS-Net人脸朝向估计

效果 项目 代码 using OpenCvSharp; using OpenCvSharp.Dnn; using System; using System.Collections.Generic; using System.Drawing; using System.Drawing.Drawing2D; using System.Linq; using System.Text; using System.Windows.Forms;namespace OpenCvSharp_DNN_Demo …

怎么监控钉钉聊天记录内容(监控钉钉聊天记录的3种形式)

企业沟通工具的普及&#xff0c;越来越多的企业开始使用钉钉作为内部沟通工具。然而&#xff0c;对于企业管理者来说&#xff0c;如何监控钉钉聊天记录内容成为了一个重要的问题。本文将介绍几种方法&#xff0c;帮助企业管理者实现监控钉钉聊天记录内容的目的。 一、钉钉自带功…

利用Vue2实现印章徽章组件

需要实现的组件效果&#xff1a; 该组件有设置颜色、大小、旋转度数和文本内容功能。 一、组件实现代码 <template><divclass"first-ring"v-bind"getBindValue":class"getStampBadgeClass":style"{ transform: rotate(${rotate}…

18.自监督视觉`transformer`模型DINO

文章目录 自监督视觉`transformer`模型DINO总体介绍DINO中使用的SSL和KD方法multicrop strategy损失函数定义`teacher`输出的中心化与锐化模型总体结构及应用reference欢迎访问个人网络日志🌹🌹知行空间🌹🌹 自监督视觉transformer模型DINO 总体介绍 论文:1.Emerging …

国际多语言出海商城源码/返佣产品自动匹配拼单商城源码

源码介绍&#xff1a; 国际多语言出海商城返佣产品自动匹配订单拼单商城源码&#xff0c;8国多语言出海拼单商城。此网站是很多巴西客户定制的原型&#xff0c;已投放运营符合当地本地化。 多语言商城返利返佣投资理财派单自带余额宝&#xff0c;采取全新支付端口&#xff0c…

Hadoop RPC简介

数新网络-让每个人享受数据的价值https://www.datacyber.com/ 前 言 RPC&#xff08;Remote Procedure Call&#xff09;远程过程调用协议&#xff0c;一种通过网络从远程计算机上请求服务&#xff0c;而不需要了解底层网络技术的协议。RPC它假定某些协议的存在&#xff0c;例…

师从IEEE Fellow|民办高校计算机专业教师自费赴美访学

D老师科研背景较弱&#xff0c;拟自费访学并带孩子出国就读&#xff0c;故要求申请到美国生活成本低且有较好公立中学教育资源的地区&#xff0c;并希望对方不收管理费。最终我们落实了德克萨斯大学达拉斯分校的邀请函&#xff0c;对方是IEEE Fellow、IET Fellow和EAI Fellow三…

链表的结点个数统计及查找

链表节点个数统计 要统计链表中的节点个数&#xff0c;只需要遍历整个链表&#xff0c;并在遍历的过程中计数即可。具体实现代码如下&#xff1a;(仍然使用C#) 先定义一个整型函数(节点个数的返回值一定是整型变量) int getLinkNodeNum(struct Test *head) {int cnt 0;whil…

类和对象(中)

目录 1.类的6个默认成员函数 2.构造函数 2.1 概念 2.2 特性 3.析构函数 3.1 概念 3.2 特性 4.拷贝构造函数 4.1 概念​ 4.2 特性 5.赋值运算符重载 5.1 运算符重载 &#xff08;重要&#xff09; 5.2 赋值运算符重载 5.3 Date类的其他运算符重载 6.const成员函数…

Linux开机、重启、关机和用户登录注销

1.【关机】 shutdown shutdown now 表示立即关机 shutdown -h now 表示立即关机 shutdown -h 1 表示1分钟后关机 halt 用来关闭正在运行的Linux操作系统 2.【重启】 shutdown -r now 表示立即重启 reboot 重启系统 sync …

2023年免费CRM软件盘点:14款热门工具全面比较(含开源)

在初创企业或小型企业阶段&#xff0c;特别是在预算有限且客户管理需求较为基础的情境下&#xff0c;使用免费的CRM系统通常是一个理智的选择。这类系统虽然在功能上可能不如付费版本丰富&#xff0c;但基本的客户信息管理、销售跟踪和沟通记录等核心功能通常都能满足需求。 对…

【Proteus仿真】【51单片机】贪吃蛇游戏

文章目录 一、功能简介二、软件设计三、实验现象联系作者 一、功能简介 本项目使用Proteus8仿真51单片机控制器&#xff0c;使用8*8LED点阵、按键模块等。 主要功能&#xff1a; 系统运行后&#xff0c;可操作4个按键控制小蛇方向。 二、软件设计 /* 作者&#xff1a;嗨小易…

蜜罐系统HFish的部署与功能实测

1. 引入 根据参考1对蜜罐的定义&#xff1a; 蜜罐&#xff08;Honeypot&#xff09;是一个计算机科学领域的术语&#xff0c;指用于检测或防御未经授权的行为或黑客攻击的陷阱。其名称来源于其工作原理类似于用来诱捕昆虫的蜜罐。蜜罐通常伪装成看似有利用价值的网路、资料、…