• 十四、Django框架使用


    目录

    一、框架简介

    Django是劳伦斯出版集团的开发人员为开发新闻内容网站而设计出来的一个软件,它遵循MVC思想,但是有自己的一个名词,叫做MVT。
    Django遵循快速开发和DRY原则。Do not repeat yourself.不要自己去重复一些工作。
    它提供了许多有用的工具和功能,使开发者能够轻松地构建高度可拓展、安全、高性能的 Web 应用。
    以下是一些 Django 框架的主要特点:

    1. 强大的路由系统:Django 提供了易于配置和管理 URL 路由的功能,使开发者能够定义页面和应用程序的 URL 映射。
    2. 数据模型和数据库支持:Django 提供了强大的数据模型层,使用它可以轻松地定义数据库模式和对数据进行管理。它支持多个数据库后端,如 PostgreSQL、MySQL、SQLite 等。
    3. 表单处理:Django 提供了易于处理和验证表单数据的功能,使开发者能够轻松地创建和处理各种表单,包括用户注册、登录、数据输入等。
    4. 身份验证和授权:Django 内置了用户身份验证和授权系统,可轻松管理用户注册、登录和权限控制。
    5. 自动化管理界面:Django 自动生成管理界面,使开发者可以方便地管理网站的后台内容,如数据库记录、用户信息等。
    6. 丰富的工具和库:Django 拥有大量的内置工具和库,使开发过程更加高效。例如,它提供了自动化的表单验证、国际化和本地化支持、缓存管理、安全性和防护等方面的工具和库。
    7. 良好的可扩展性和高性能:Django 架构具有良好的可扩展性,在处理高流量和大量数据的应用程序时表现出色。

    二、MVT模型简介

    MVT 模型是 Django 框架中的一种设计模式,用于组织和管理 Web 应用的结构和业务逻辑。MVT 是指 Model(模型)、View(视图)、Template(模板)。
    以下是 MVT 模型中的各个组件的功能和职责:

    1. Model(模型):模型代表数据的结构、字段和关系。在 Django 中,模型是用于定义数据表结构的 Python 类。它定义了应用程序所需的数据库模式,并提供了访问、操作和查询数据库的方法。模型通常映射到数据库表,并通过对象关系映射(ORM)来进行数据库操作。
    2. View(视图):视图是处理 Web 请求的代码逻辑部分,它充当了控制器的角色。负责视图接收请求,并根据业务逻辑获取(或修改)所需的数据。在 Django 中,视图通常是一个 Python 函数或类,它接收请求对象作为输入,并返回一个响应对象,可以是 HTML 内容、JSON 数据等。
    3. Template(模板):模板是用于呈现数据和生成最终输出的视图层。模板使用一种模板语言,结合传递给模板的数据,生成最终的输出结果。在 Django 中,模板通常是包含 HTML 和模板标记的文本文件,可以包含动态的数据、条件语句、循环等。
      MVT 模型的工作流程如下:
    • 当用户请求一个 URL 时,Django 的 URL 路由系统会将该请求与对应的视图函数或类匹配。
    • 视图函数或类接收请求对象,并根据业务逻辑处理请求,可能会涉及到查询数据库、处理表单数据等。
    • 视图函数或类将处理后的数据传递给指定的模板进行呈现。
    • 模板根据接收到的数据生成最终的 HTML 内容,在服务器上生成响应。
    • 服务器将响应发送给用户的浏览器,用户可以在浏览器中看到生成的 HTML 页面。
      下面是一个MVT模型的交互图示例:
      在这里插入图片描述

    三、Python的虚拟环境

    Python的虚拟环境是一个独立的、隔离的Python开发环境,它允许您在同一系统上同时管理多个不同的Python项目,每个项目都可以有自己的依赖包和配置。使用虚拟环境可以避免不同项目之间的包冲突,并提供了一种干净的开发环境。
    通过创建虚拟环境,您可以在其中安装和管理特定于每个项目的Python包和依赖项,而不会干扰系统级Python安装和其他项目的依赖项。这样可以确保项目在不同环境下的一致性,并提供更好的隔离性和可移植性。
    Python有多种工具可以创建和管理虚拟环境,最常用的是venv模块(自Python 3.3开始内置)和第三方工具如virtualenv和conda。使用这些工具,您可以在您选择的目录中创建一个独立的Python环境,并在其中安装所需的库和工具。
    创建虚拟环境后,您可以激活它并在其中运行Python解释器,然后您在该环境中安装的所有软件包和依赖项都将在该环境中使用。这使得您可以在不同的项目之间切换,而无需担心包版本冲突或项目特定的配置问题。
    总结来说,Python的虚拟环境是一种用于在同一系统上隔离管理多个Python项目的机制,它提供了依赖包隔离、环境隔离和更好的项目管理能力。这是Python开发中的重要工具,尤其是在大型项目或需要使用不同Python版本的项目中。

    3.1 安装virtualenv 虚拟环境

    (1) 在Linux系统上的安装步骤:

    1. sudo pip install virtualenv #安装虚拟环境
    2. sudo pip install virtualenvwrapper #安装虚拟环境扩展包
    3. mkdir ~/.virtualenvs #在home目录下创建存放虚拟环境的文件夹
    4. 编辑home目录下面的.bashrc文件,添加下面两行。
    export WORKON_HOME=$HOME/.virtualenvs
    source /usr/local/bin/virtualenvwrapper.sh
    
    • 1
    • 2
    1. 使用source .bashrc使其生效一下。

    (2) 在Mac上的安装步骤:

    1. 先确认输入pip -V查看的版本和安装路径是和你所安装的python3版本一致的, 例如:
      在这里插入图片描述
    2. sudo pip install virtualenv #安装虚拟环境
    3. sudo pip install virtualenvwrapper #安装虚拟环境扩展包
    4. mkdir ~/.virtualenvs #在home目录下创建存放虚拟环境的文件夹
    5. 编辑home目录下.bash_profile文件,添加下面两行
    export WORKON_HOME=$HOME/.virtualenvs
    source /Library/Frameworks/Python.framework/Versions/3.11/bin/virtualenvwrapper.sh
    
    • 1
    • 2

    注意:如果您使用 pip 命令以系统管理员身份(使用 sudo)安装了 virtualenvwrapper,它通常会被安装在pip命令所在的Python版本的路径下。例如我的python3.11.4是在/Library/Frameworks/Python.framework/目录下。如果不确定pip命令安装virtualenvwrapper时的安装路径和版本可以通过下面命令查找.
    查看版本:
    使用pip list 或者 pip freeze, 例如:
    在这里插入图片描述
    在这里插入图片描述
    查看路径使用pip show, 例如:
    在这里插入图片描述
    6. 使用source .bash_profile使其生效一下。
    如果遇到下面的问题:
    在这里插入图片描述
    可以看到 Python 虚拟环境所用的 Python 解释器路径为 /System/Library/Frameworks/Python.framework/Versions/2.7/Resources/Python.app/Contents/MacOS/Python,而 virtualenvwrapper.sh 文件无法从该路径中导入所需的模块。
    解决这个问题的方法是,确保您的 virtualenvwrapper 是针对您所使用的 Python 版本进行安装的,并使用相应的 Python 解释器来加载 virtualenvwrapper。
    我这边可以很明确的知道virtualenvwrapper是安装在python3.11.4版本下的, 因此按照错误提示,我们需要修改VIRTUALENVWRAPPER_PYTHON的环境变量,将其指定到python3.11.4的解释器上, 继续编辑~/.bash_profile文件添加下面环境变量

    export VIRTUALENVWRAPPER_PYTHON=/Library/Frameworks/Python.framework/Versions/3.11/bin/python3
    
    • 1

    当您在创建和管理虚拟环境时,virtualenvwrapper 会使用该环境变量中指定的 Python 解释器来运行虚拟环境。通过设置正确的 VIRTUALENVWRAPPER_PYTHON 环境变量,您可以确保 virtualenvwrapper 使用您希望的特定 Python 版本。
    完成设置后,再次执行source ~/.bash_profile, 看到下面提示说明成功了.
    在这里插入图片描述
    此时会发现~/.virtualevns目录下多了很多文件,这些文件夹是 virtualenvwrapper 的一部分,用于存储关于虚拟环境的信息和自定义脚本。以下是其中一些文件和文件夹的说明:

    • premkproject、postmkproject、initialize 以及其他以 premk、postmk、prerm、postrm、predeactivate、postdeactivate、preactivate、postactivate 等开头的文件:这些文件是用户自定义脚本文件,可以在创建、激活、停用等虚拟环境操作时触发执行用户定义的命令。
    • get_env_details 文件:此文件包含一些有关虚拟环境的详细信息(例如名称、路径、Python 解释器等)

    3.2 创建和使用虚拟环境

    1.创建虚拟环境

    mkvirtualenv -p python3 bj11_py3
    
    • 1

    上面的命令是使用 virtualenvwrapper 创建名为 bj11_py3 的虚拟环境,使用 Python 3 解释器的命令。
    这个命令的各个部分的含义:

    • mkvirtualenv:这是 virtualenvwrapper 提供的命令之一,用于创建虚拟环境(也称为虚拟 Python 环境)。
    • -p python3:这是 mkvirtualenv 命令的一个选项,用于指定要用于创建虚拟环境的 Python 解释器版本。在这种情况下,python3 表示使用 Python 3 解释器。
    • bj11_py3:这是要创建的虚拟环境的名称。您可以将其替换为您自己想要的任何名称。虚拟环境名称应该是唯一的,在您的开发中有意义,并具有描述性。
      运行上面命令后,可以在~/.virtualenvs目录下看到创建的虚拟环境
      在这里插入图片描述

    2.进入虚拟环境

    workon bj11_py3
    
    • 1

    这样就可以进入刚刚创建的Python虚拟环境了.
    注意: 在激活(或进入)虚拟环境后,您可以执行的所有命令都将在该虚拟环境中执行。例如你在虚拟环境中执行which Python命令,查看当前的Python命令路径会显示为虚拟环境下的Python路径, 如下图所示:
    在这里插入图片描述
    3. 退出虚拟环境

    deactivate
    
    • 1

    运行上面命令可以退出当前进入的虚拟环境

    4.删除虚拟环境

    rmvirtualenv bj11_py3
    
    • 1

    运行上面命令将会删除bj11_py3虚拟环境 ,同时也会删除在~/.virtualenvs目录下创建bj11_py3文件夹

    5.虚拟环境下安装包

    pip install 包名
    
    • 1

    注意:不能使用sudo pip install 包名,这个命令会把包安装到真实的主机环境上而不是安装到虚拟环境中。
    虚拟环境下安装的包会存在虚拟环境/lib/pythonxxx/site-packages目录下
    在这里插入图片描述
    6.查看虚拟环境下所安装的包

    pip list 或者 pip freeze
    
    • 1

    例如新创建的虚拟环境默认会有安装下面的包
    在这里插入图片描述

    四、Django项目的搭建

    4.1 安装Django包

    进入到Python的虚拟环境中执行安装, 安装的方式还是使用pip命令安装, 只是在虚拟环境下执行, 会将安装包安装到虚拟环境的对应目录下, 例如:

    workon bj11_py3 # 进入bj11_py3虚拟环境
    pip install django # 开始安装django
    
    • 1
    • 2

    上面方式安装包会安装最新的版本(当前最新版本是4.2.4), 如果要指定安装对应的版本,可以这样

    pip install django==1.8.2 # 指定安装1.8.2版本的django
    
    • 1

    注意:
    安装同一个包的多个版本, 后面安装的版本会覆盖前面安装的版本.

    安装完后, 就可以在虚拟环境的找到django包了
    在这里插入图片描述

    4.2 创建Django项目

    使用命令:django-admin startproject [项目名] 注意:创建应用必须先进入虚拟环境。
    以在2023_py3虚拟目录下创建day01项目为例, 大致步骤如下:

    mkvirtualenv 2023_py3 # 创建虚拟环境
    workon 2023_py3 # 切换到虚拟环境
    pip install django # 在虚拟环境下安装django
    django-admin startproject day01 #创建django项目
    
    • 1
    • 2
    • 3
    • 4

    运行完上面命令后, 会在当前命令提示符所在的路径下创建一个day01的文件夹, 里面包含如下内容:
    在这里插入图片描述
    由于我们当前命令的提示符是在~(home)目录下的,所以day01其实是在home目录下的, 而不是在虚拟环境下的, 也就是说普通的shell命令还是运行在系统环境中的.
    上面文件的说明如下:

    • init.py:此文件是一个空文件,用于指示day01文件夹是一个Python包。
    • asgi.py:这是一个ASGI(Asynchronous Server Gateway Interface)应用程序的入口点。ASGI是一种为Python Web应用程序提供异步通信的接口。
    • settings.py:这个文件包含了Django项目的所有配置。您可以在这里设置数据库、静态文件路径、应用程序和中间件等。
    • urls.py:这个文件定义了项目的URL映射关系,决定了请求的URL应该由哪个视图处理函数来处理。
    • wsgi.py:这是一个WSGI(Web Server Gateway Interface)应用程序的入口点。WSGI是一种为Python Web应用程序提供通用接口的标准。
    • manage.py:这是一个Django命令行工具,用于管理和操作Django项目。您可以使用它运行开发服务器、执行数据库迁移、创建管理员用户等。

    4.3 创建Django项目的应用

    在Django中,应用(App)是指一个可重用的独立模块,用于实现特定功能或提供特定服务。每个Django项目都由一个或多个应用组成,这些应用可以是您自己编写的应用,也可以是其他开发者编写的应用。
    应用通常是一个具有特定功能的集合,例如用户认证、博客、论坛等。它们可以包含模型(Model)、视图(View)和模板(Template),以及其他一些文件和逻辑,用于处理相关的业务逻辑和数据操作。
    使用应用的好处是可以实现模块化和重用性。您可以编写一次应用代码,并在多个项目中重复使用它。应用可以独立开发、测试和维护,使项目结构更加清晰和可扩展。
    在Django中,您可以使用以下命令创建新的应用:

    cd django项目的根路径
    python manage.py startapp [应用的名称]
    
    • 1
    • 2

    例如:

    (2023_py3) chenyousheng@chenyoushengdeMac-mini ~ % cd day01
    (2023_py3) chenyousheng@chenyoushengdeMac-mini day01 % ls
    day01                manage.py
    (2023_py3) chenyousheng@chenyoushengdeMac-mini day01 % python manage.py startapp booktest
    Traceback (most recent call last):
      File "/Users/chenyousheng/day01/manage.py", line 11, in main
        from django.core.management import execute_from_command_line
    ModuleNotFoundError: No module named 'django'
    
    The above exception was the direct cause of the following exception:
    
    Traceback (most recent call last):
      File "/Users/chenyousheng/day01/manage.py", line 22, in <module>
        main()
      File "/Users/chenyousheng/day01/manage.py", line 13, in main
        raise ImportError(
    ImportError: Couldn't import Django. Are you sure it's installed and available on your PYTHONPATH environment variable? Did you forget to activate a virtual environment?
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    如果遇到上面的错误一般有2个原因:

    1. 你的虚拟环境没有激活, 也就是没有执行workon命令进入指定的虚拟环境
    2. 你的python命令关联的是系统的python路径, 并没有关联到虚拟机环境中的python命令, 由于你系统的python环境中没有安装django导致的.
      我这边是因为第2个原因, 因为之前在.bash_profile中添加alias别名, 将python指定了系统的python3.11.4命令,通过在控制台中输入which python也可以发现这个问题:
      在这里插入图片描述
      可以看到python执行的路径是/usr/local/bin/python3, 这个路径并不是~/.virtualenvs开头的路径, 因为我们虚拟环境都是安装在~/.virtualenvs目录下的.
      解决办法很简单, 直接把alias干掉即可. 有两种办法:
    • 使用unalias命令删除别名只会在当前会话中生效,相当于临时删除别名。如果您重新启动终端或注销/登录系统,别名将会恢复。
    • 如果您希望永久删除别名,请编辑相应的配置文件(例如.bashrc或.bash_profile),找到别名的设置并将其删除或注释掉。保存更改后,重新加载终端或运行source命令以使更改生效。
      在Mac上,常见的位置是在~/.bash_profile文件中设置别名。您可以使用文本编辑器打开这个文件并注释或删除相关的别名行。
      去掉别名后, 再执行which python命令就可以看到使用的是虚拟环境下的python了
      在这里插入图片描述
      此时, 再次在day01目录下执行下面命令:
    python manage.py startapp booktest
    
    • 1

    不报错说明创建应用成功了, 然后通过tree命令可以查看应用的目录结构如下:
    在这里插入图片描述
    上面文件的说明如下:

    • init.py:这是一个空的__init__.py文件,用于将目录booktest标记为Python包。
    • admin.py:这个文件通常用于定义与Django后台管理相关的模型注册和配置选项。
    • apps.py:这个文件是应用程序的配置文件,可以在其中进行应用程序的特定配置。
    • migrations:这个目录通常用于存储Django数据库迁移的相关文件,其中的__init__.py表示该目录是一个Python包。
    • models.py:这个文件通常用于定义Django模型,即数据库表的结构和字段。
    • tests.py:这个文件通常用于编写Django应用程序的测试代码。
    • views.py:这个文件通常用于定义Django视图,即处理HTTP请求并返回HTTP响应的函数或类。

    4.4 使用pycharm打开Django项目

    例如用pycharm打开~/day01的项目, 你会发现此时idea使用的python解释器还是系统之前安装版本的解释器
    在这里插入图片描述
    此时我们需要修改为我们虚拟机环境下的解释器, 可以这样操作: Preferences>Project:day01>Python Interpreter> 点击右侧齿轮按钮选择Add
    在这里插入图片描述
    然后找到虚拟环境中的Python解释器
    在这里插入图片描述
    点击OK返回就可以看到切换成功了.
    在这里插入图片描述
    然后回到pycharm左侧界面可以看到python解释器已经变成了虚拟环境下的版本了.
    在这里插入图片描述
    然后随便打开一个python文件,会看到django包需要安装,直接安装即可
    在这里插入图片描述

    4.5 注册Django项目的应用

    建立应用和项目之间的联系,需要对应用进行注册。修改settings.py中的INSTALLED_APPS配置项。
    在这里插入图片描述

    4.6 启动Django项目

    在当前项目根路径下执行

    python manage.py runserver
    
    • 1

    在这里插入图片描述
    出现上面界面说明启动成功了, 此时浏览器输入http://127.0.0.1:8000/可以看到下面的界面
    在这里插入图片描述
    但是你会发现上面的控制台中还出现了这个错误:

    You have 18 unapplied migration(s). Your project may not work properly until you apply the migrations for app(s): admin, auth, contenttypes, sessions.
    Run 'python manage.py migrate' to apply them.
    
    • 1
    • 2

    意思您有18个未应用的迁移。在应用程序迁移之前,您的项目可能无法正常工作:管理员、身份验证、内容类型、会话。运行"python manage.py migrate"来应用它们。
    这个按照提示执行"python manage.py migrate"就可以了, 先在控制台按ctrl+c结束项目, 然后执行这条命令如下所示:
    在这里插入图片描述
    然后重新执行python manage.py runserver启动即可, 此时将不再看到有警告提示了:
    在这里插入图片描述
    python manage.py runserver命令默认在端口8000上启动开发服务器。如果您想要更改默认端口,可以在运行命令时指定不同的端口号。例如:python manage.py runserver 8080, 如下所示:
    在这里插入图片描述

    五、ORM框架

    Django 的 ORM(对象关系映射)框架是 Django 提供的一个功能强大的工具,用于在 Python 代码和数据库之间进行交互。
    ORM 框架的主要目标是在应用程序的数据模型和底层数据库之间建立映射关系,从而允许开发人员使用面向对象的方式操作数据库,而不是直接编写 SQL 查询。
    Django 的 ORM 框架提供了一个高级 API,它使您能够使用 Python 类和方法来创建、读取、更新和删除数据库记录,而无需编写繁琐的 SQL 查询语句。
    ORM 框架的常见用法包括:

    • 定义模型:您可以使用 Django 的 ORM 框架通过定义 Python 类来定义数据库的数据模型。这些类将被映射到数据库的表,每个类的属性对应于表中的列。
    • 进行查询:Django ORM 框架提供了一种简洁和易于使用的查询语言,使您能够执行复杂的数据库查询。您可以使用链式调用和过滤器来过滤查询结果,或者使用聚合和注释来进行数据分析。
    • 进行关联:Django ORM 框架使您能够通过定义关系字段来直接在模型之间建立关联。这样,您可以在模型之间轻松地进行关联查询,例如获取一个对象的关联对象,或者反向跟踪关联对象。
    • 数据库迁移:Django ORM 提供了一个迁移系统,用于跟踪和应用数据库模式的更改。通过迁移,您可以轻松地对数据库结构进行版本控制,并在开发过程中进行更新和升级。
      ORM 框架的好处包括提高开发效率、提供易于维护和阅读的代码、提供数据库的平台无关性等。
      使用 Django 的 ORM 框架,您可以将精力集中在应用程序的业务逻辑上,而无需过多关注底层数据库的操作。

    5.1 模型类的设计

    设计 Django 中的模型类主要涉及如何映射数据库表和定义模型的字段。
    下面是一些设计 Django 模型类的常见步骤和注意事项:

    1. 寻找实体和属性:首先确定您的应用程序需要管理哪些数据实体。每个实体将对应一个模型类。然后,为每个实体确定需要存储的属性,并将它们映射到模型类的字段。
    2. 寻找实体之间的关系:如果您的应用程序中的实体之间存在关系,例如一对多或多对多关系,需要在模型类之间定义适当的关系字段。这些关系字段将帮助您方便地进行关联查询和获取关联实体的数据。
    3. 选择合适的字段类型:Django 提供了多种字段类型,用于存储不同类型的数据。根据属性的特性,选择合适的字段类型。常见的字段类型包括字符字段(CharField)、整数字段(IntegerField)、日期时间字段(DateTimeField)等。
    4. 添加验证和约束:根据需求,可以在模型类中添加验证和约束,以确保数据的完整性和有效性。Django 提供了多种验证器和约束选项,例如最大长度、唯一性、必填性等。
    5. 处理外键关系:如果模型类之间存在外键关系,可以使用ForeignKey字段来定义关联。外键字段将帮助您建立模型之间的关联,并提供方便的查询和数据访问。
    6. 添加特定行为和方法:您可以为模型类添加自定义方法和属性,以提供特定的行为和操作。这些方法可以对模型对象进行操作,执行业务逻辑或进行其他计算。
    7. 迁移和更新数据库:一旦您设计完模型类,使用 makemigrations 命令来生成迁移文件,然后使用 migrate 命令将这些迁移应用到数据库中。这将创建或更新数据库中的相应表和列。

    5.2 模型类的使用步骤

    1. 创建模型类

    如果我想在booktest应用的models.py中添加一个BookInfo类作为模型类, 可以这样定义:

    from django.db import models
    
    
    # Create your models here.
    # 图书类
    class BookInfo(models.Model):
        """图书模型类"""
        # 图书的标题: btitle代表数据库表中的btitle字段,CharField说明是一个字符串,max_length指定字符串的最大长度
        btitle = models.CharField(max_length=20)
    
        # 图书的出版日期: bpub_date代表数据库中bpub_date字段,DateField说明是日期类型
        bpub_date = models.DateField()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    模型类中不需要指定id主键字段, 这个Django会帮我们自动生成.

    2. 生成迁移文件

    有了模型类之后,我们还需要生成迁移文件, 在~/day01项目根路径下执行如下命令:

    python manage.py makemigrations
    
    • 1

    成功后会看到生成的迁移文件所在的路径
    在这里插入图片描述
    对应项目的内容如下:
    在这里插入图片描述

    3. 执行迁移生成表

    在~/day01项目根路径下执行如下命令:

    python manage.py migrate
    
    • 1

    成功后会看到Applying ok的提示
    在这里插入图片描述

    5.3 查看Django的默认数据库

    Django 默认使用的数据库是 SQLite,它是一个轻量级、功能强大的嵌入式数据库。当您创建一个 Django 项目时,默认情况下会配置并使用 SQLite 数据库。
    你可以在项目的settings.py文件中查看

    from pathlib import Path
    
    # 获取到项目的根路径,其中resolve方法可以转换为绝对路径
    BASE_DIR = Path(__file__).resolve().parent.parent
    
    # Database
    # https://docs.djangoproject.com/en/4.2/ref/settings/#databases
    
    DATABASES = {
       
        'default': {
       
            'ENGINE': 'django.db.backends.sqlite3',
            'NAME': BASE_DIR / 'db.sqlite3',
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    他对应的db文件就在下面这个位置
    在这里插入图片描述
    如何在Mac控制台下查看这个db文件呢?
    Mac下自带安装了sqlite3命令, 因此可以直接使用该命令打开sqlite文件, 例如:
    在这里插入图片描述
    在Linux平台可以安装sqliteman工具类查看
    如果想在sqlite3中查看有哪些表可以输入.table命令查看
    在这里插入图片描述
    可以看到我们的BookInfo类对应的表的表名是booktest_bookinfo, 也就是 应用的名字_+模型的类名小写。
    如果我们想要查看booktest_bookinfo表的建表结构, 可以使用.schema命令, 如:
    在这里插入图片描述

    5.4 通过模型类操作数据库表

    在 Django shell 中执行数据库操作,您可以按照以下步骤进行操作:

    • 打开终端并进入到 Django 项目的根目录。
    • 进入 Django shell。在终端中运行以下命令:
    python manage.py shell
    
    • 1
    • 导入模型类。在 Django shell 中,您需要先导入模型类才能使用它们。
    • 执行数据库操作

    1. 插入记录

    首先进入django shell
    在这里插入图片描述
    以在booktest_bookinfo表中插入一条数据为例:

    >>> from booktest.models import BookInfo # 导入模块类
    >>> b = BookInfo() # 创建一个BookInfo实例
    >>> b.btitle = '天龙八部' # 设置标题
    >>> from datetime import date # 导入日期模块
    >>> b.bpub_date = date(1990,1,1) # 设置出版日期
    >>> b.save() 保存记录
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    执行完上面操作后, 我们可以查看sqlite中的变化 ,首先输入exit()退出django shell, 然后使用sqlite3命令进入到db文件.
    在这里插入图片描述
    可以看到记录插入成功了.

    2. 更新记录

    如果要在django shell中获取记录, 并修改值的话可以使用模型类的objects对象的get方法来获取, 例如:

    >>> from booktest.models import BookInfo # 导入模块类
    >>> b = BookInfo.objects.get(id=1) # 获取id=1的这条记录
    >>> b.btitle = "西游记" # 修改书名
    >>> b.save() # 重新保存
    
    • 1
    • 2
    • 3
    • 4

    修改后,再次查看sqlite, 可以发现修改成功了.
    在这里插入图片描述

    3. 删除记录

    如果要删除表中的记录, 可以使用delete方法

    >>> from booktest.models import BookInfo # 导入模块类
    >>> b = BookInfo.objects.get(id=1) # 获取id=1的这条记录
    >>> b.delete() # 删除这条记录
    
    • 1
    • 2
    • 3

    5.5 一对多模型操作

    1. 建立一对多关系模型

    在booktest/models.py中新增HeroInof模型类, 和图书类建立关系. 一本图书可以有多个英雄, 也就是一对多关系

    # 一类
    # 图书类
    class BookInfo(models.Model):
        """图书模型类"""
        # 图书的标题: btitle代表数据库表中的btitle字段,CharField说明是一个字符串,max_length指定字符串的最大长度
        btitle = models.CharField(max_length=20)
    
        # 图书的出版日期: bpub_date代表数据库中bpub_date字段,DateField说明是日期类型
        bpub_date = models.DateField()
    
    
    # 多类
    # 英雄类
    class HeroInfo(models.Model):
        # 英雄名字
        hname = models.CharField(max_length=20)
        # 英雄性别 默认False, 代表是男
        hgender = models.BooleanField(default=False)
        # 英雄的备注
        hcomment = models.CharField(max_length=128)
        # 在多类中定义关系属性,建立图书类和英雄类的一对多关系, 当生成表的字段时, 字段名会变成: 关系属性名_id, 也就是外键
        # on_delete用于指定级联删除的规则
        hbook = models.ForeignKey('BookInfo', on_delete=models.DO_NOTHING)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    注意:
    在Django 2.0版本之前,ForeignKey字段的on_delete参数是可选的,但默认行为是CASCADE。这意味着如果不显式指定on_delete参数,在旧版本中会默认使用级联删除。
    然而,从Django 2.0版本开始,on_delete参数变为必需参数,你必须显式指定它。这样可以提醒开发者明确选择删除行为,同时也避免了意外的数据损失。
    Django还提供了其他几个on_delete选项,以满足不同的需求。以下是一些常用的选项:

    1. models.CASCADE: 表示在被引用的对象被删除时,与之相关联的对象也将被级联删除。
    2. models.PROTECT: 如果有其他对象引用了被删除的对象,那么阻止删除操作并引发ProtectedError异常。
    3. models.SET_NULL: 将外键字段设置为NULL(如果允许为NULL)。
    4. models.SET_DEFAULT: 将外键字段设置为其默认值。
    5. models.SET(value): 将外键字段设置为指定的值。
    6. models.SET(…):可以使用一个函数或可调用对象来确定外键字段的值。
    7. models.SET():设置外键字段为目标的主键值。
    8. models.DO_NOTHING: 不做任何操作,仅仅删除被引用对象。

    2. 生成迁移文件和执行迁移

    这个步骤使用的命令和之前是一样的

    python manage.py makemigrations
    python manage.py migrate
    
    • 1
    • 2

    如下图所示:
    在这里插入图片描述

    注意: 执行命令生成的迁移文件是不能够删除的, 因为后面的迁移文件可能会依赖前面的迁移文件.

    操作完成后, 查看生成的表结构:
    在这里插入图片描述

    3. 通过模型类操作数据库

    仍然使用django shell进行操作

    >>> from booktest.models import BookInfo,HeroInfo # 导入书籍和英雄模型类
    >>> b = BookInfo() # 创建书籍类
    >>> b.btitle = '天龙八部'
    >>> from datetime import date
    >>> b.bpub_date = date(1990,10,11)
    >>> b.save()
    >>> h = HeroInfo() # 创建英雄类
    >>> h.name = '郭靖'
    >>> h.hgender = False
    >>> h.hcomment = '降龙十八掌'
    >>> h.hbook = b # 关联英雄类的所在的书籍
    >>> h.save()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    如果要查询图书表或者英雄表的所有内容, 可以这样操作:

    BookInfo.objects.all()
    HeroInfo.objects.all()
    
    • 1
    • 2

    如下图所示:
    在这里插入图片描述
    如果要通过图书查找关联的英雄,可以使用

    图书对象.多方类名小写_set.all()
    
    • 1

    如下图所示:
    在这里插入图片描述

    4. 关系字段类型

    关系型数据库的关系包括三种类型:

    • ForeignKey:一对多,将字段定义在多的一端中。
    • ManyToManyField:多对多,将字段定义在任意一端中。
    • OneToOneField:一对一,将字段定义在任意一端中。
    • 可以维护递归的关联关系,使用’self’指定,详见"自关联"。
      (1) 一对多关系
      参见booktest应用中的BookInfo类和HeroInfo类。
    #定义图书模型类BookInfo
    class BookInfo(models.Model):
        btitle = models.CharField(max_length=20)#图书名称
        bpub_date = models.DateField()#发布日期
        bread = models.IntegerField(default=0)#阅读量
        bcomment = models.IntegerField(default=0)#评论量
        isDelete = models.BooleanField(default=False)#逻辑删除
    
    #定义英雄模型类HeroInfo
    class HeroInfo(models.Model):
        hname = models.CharField(max_length=20)#英雄姓名
        hgender = models.BooleanField(default=True)#英雄性别
        isDelete = models.BooleanField(default=False)#逻辑删除
        hcomment = models.CharField(max_length=200)#英雄描述信息
        hbook = models.ForeignKey('BookInfo',on_delete=models.DO_NOTHING)#英雄与图书表的关系为一对多,所以属性定义在英雄模型类中
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    (2) 多对多关系
    我们下面设计一个新闻类和新闻类型类,一个新闻类型下可以用很多条新闻,一条新闻也可能归属于多种新闻类型。
    重新在项目day01下新建一个应用newstest

    python manage.py startapp newstest
    
    • 1

    然后在day01/settings.py文件中注册应用

    INSTALLED_APPS = [
        ...
        'booktest',
        'newstest'
    ]
    
    • 1
    • 2
    • 3
    • 4
    • 5

    编辑newstest/models.py文件设计模型类。

    class TypeInfo(models.Model):
      tname = models.CharField(max_length=20) #新闻类别
    
    class NewsInfo(models.Model):
      ntitle = models.CharField(max_length=60) #新闻标题
      ncontent = models.TextField() #新闻内容
      npub_date = models.DateTimeField(auto_now_add=True) #新闻发布时间
      ntype = models.ManyToManyField('TypeInfo') #通过ManyToManyField建立TypeInfo类和NewsInfo类之间多对多的关系
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    5.6 后台管理

    Django 提供了一个内置的后台管理界面,可以帮助您轻松管理您的应用程序数据。
    要使用Django 的后台管理首先需要确保Django 项目的 settings.py 文件中 ‘django.contrib.admin’ 被包含在内INSTALLED_APPS内,并且没有被注释掉。

    INSTALLED_APPS = [
        ...
        'django.contrib.admin',
        ...
    ]
    
    • 1
    • 2
    • 3
    • 4
    • 5

    1. 本地化设置

    在 settings.py 文件中添加 LANGUAGES 设置。这将设置 Django 可用的语言选项,以便用户可以选择他们偏好的语言。示例配置如下:

    LANGUAGES = [
        ('en', 'English'),
        ('zh-hans', '简体中文'),
    ]
    
    • 1
    • 2
    • 3
    • 4

    在 settings.py 文件中设置 LANGUAGE_CODE 为您想要使用的默认语言, 如中文简体(‘zh-hans’)

    LANGUAGE_CODE = 'zh-hans'
    
    • 1

    在 settings.py 文件中,添加 django.middleware.locale.LocaleMiddleware 至 MIDDLEWARE 部分,确保它是在 ‘django.contrib.sessions.middleware.SessionMiddleware’ 和 ‘django.middleware.common.CommonMiddleware’ 之间。

    MIDDLEWARE = [
        ...
        'django.contrib.sessions.middleware.SessionMiddleware',
        'django.middleware.locale.LocaleMiddleware',
        'django.middleware.common.CommonMiddleware',
        ...
    ]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    在 settings.py 文件中,确保 LOCALE_PATHS 设定指向您的本地化文件所在的目录。

    import os
    
    LOCALE_PATHS = [
        os.path.join(BASE_DIR, 'locale'),
    ]
    
    • 1
    • 2
    • 3
    • 4
    • 5

    在项目根目录中创建 locale 文件夹,并在其中创建相应的语言文件夹,例如 zh_Hans 文件夹。
    在这里插入图片描述
    运行以下命令,生成翻译文件:

    python manage.py makemessages -l zh_Hans
    
    • 1

    执行成功后, local/zh_Hans文件夹内会多一些内容
    在这里插入图片描述
    打开生成的 django.po 文件,在其中添加您希望本地化的文本翻译。例如,将英文文本翻译为中文。
    在 .po 文件中,每个需要翻译的字符串都有一个类似于以下的结构:

    #: :
    #. 
    msgid ""
    msgstr ""
    
    • 1
    • 2
    • 3
    • 4

    msgid 是原始文本的部分,msgstr 是要填写翻译后的文本的部分。
    在 msgstr 部分中,添加您希望的翻译文本。例如,如果您希望将英文文本 “Hello, world!” 翻译为中文,可以进行如下修改:

    #: :
    #. 
    msgid "Hello, world!"
    msgstr "你好,世界!"
    
    • 1
    • 2
    • 3
    • 4

    继续在 .po 文件中添加其他需要翻译的文本,每个翻译后的文本都应在相应的 msgstr 部分进行编辑。
    最后, 运行以下命令将 .po 文件编译成 .mo 文件:

    python manage.py compilemessages
    
    • 1

    成功后会出现下面的.mo文件
    在这里插入图片描述
    要将时区设置为上海(Asia/Shanghai),只需在Django的配置文件settings.py中将TIME_ZONE参数设置为’Asia/Shanghai’,如下所示:

    TIME_ZONE = 'Asia/Shanghai'
    
    • 1

    以上所有的设置完成后, 需要重启服务器才能生效.

    2. 创建管理账号

    要创建Django后台管理账号,可以使用Django提供的命令行工具createsuperuser
    在终端或命令提示符中,进入您的Django项目的根目录。运行以下命令以创建超级用户:

    python manage.py createsuperuser
    
    • 1

    然后根据提示输出管理员账号、邮箱、密码等, 如下图所示:
    在这里插入图片描述

    3. 进入后台管理页面

    首先先启动发服务

    python manage.py runserver
    
    • 1

    然后在浏览器中输入下面地址访问

    http://127.0.0.1:8000/admin
    
    • 1

    看到下面登录界面后, 输入刚刚创建的管理员账号密码进行登录
    在这里插入图片描述
    成功后会看到这个界面
    在这里插入图片描述

    4. 在后台管理中管理数据库

    要在后台管理中管理数据库表需要将对应的应用的模块进行注册,可以通过在对应应用下的 admin.py 文件中导入您的模型类,并将其注册到 admin.site.register() 函数中来实现。例如:

    from django.contrib import admin
    from booktest.models import BookInfo, HeroInfo
    
    # Register your models here.
    admin.site.register(BookInfo)
    admin.site.register(HeroInfo)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    此时, 再次刷新后台管理页面, 就可以看到出现了booktest应用下的2个表了
    在这里插入图片描述
    点击BookInfos后可以进入到图书表的管理,可以看到下图中已经有一条记录在表中
    [图片]
    但是显示的内容很难知道是什么, django是如何控制这里展示的内容的?
    其实是通过模型类的__str__方法返回的内容展示的. 因此我们可以通过重写该方法来实现返回的内容, 例如图书表,我们可以让他返回图书的标题, 修改BookInfo模型类:

    class BookInfo(models.Model):
        """图书模
    • 1
  • 相关阅读:
    应用场景不同,使用的“代码”也不同
    kafka同步副本集及关键参数
    矩池云|GPU 分布式使用教程之 TensorFlow
    leetcode:1929. 数组串联(python3解法)
    Redis配置哨兵及其机制
    杨民道:BendDAO流动性危机对DeFi和NFT行业有何启示
    设计模式-迭代器模式
    深度学习验证码项目
    Rook Ceph浅谈
    【C++入门】不能重载为友元函数的4个运算符(=, ->, [ ], ( ))
  • 原文地址:https://blog.csdn.net/mChenys/article/details/133899363