【邂逅Django】——(二)数据库配置

🔥 邂逅Django – 目录

✅ Part 1:【邂逅Django】—— (一)创建项目

✅ Part 2:【邂逅Django】—— (二)数据库配置

🛠️ Part 3:【邂逅Django】—— (三)视图

🛠️ Part 4:【邂逅Django】—— (四)表单和通用视图

🛠️ Part 5:【邂逅Django】—— (五)完善界面(自定义界面和样式)

🛠️ Part 6:【邂逅Django】—— (六)自定义管理界面

🛠️ Part 7:【邂逅Django】—— (七)自动化测试

🎈 前言

本系列文章,在 Django官方文档教程的基础模板下,进行了一定的改进和删除,添加了一些自己的见解。

希望大家看完该系列文章后,对 Django能够有一个清晰的认识。

这是一个漫长的道路,我不会停止追求!

[En]

It’s a long way to go, I won’t stop pursuing it!

Django官方文档:https://www.djangoproject.com/

❗ ❗ ❗ 学习过程中,多看官方文档,可以解决很多问题 ❗ ❗ ❗

本教程使用 poetry对项目环境进行管理。
相关 poetry的安装与使用,请参考【Python – 虚拟环境】项目的启动,从隔离开发环境开始 – CoderChaos – 博客园 (cnblogs.com)

一、项目配置文件 settings.py

🌊 1.1 数据库配置

mysite/settings.py,是个包含了 Django项目设置的 Python模块。

数据库的配置,在于变量 DATABASES

Django默认使用 SQLite作为默认数据库。 Python内置 SQLite,所以无需安装额外的东西就可以使用。

如果做一个真正的项目,最好不要使用 SQLite

Django 默认使用 SQLite
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': BASE_DIR / 'db.sqlite3',
    }
}

Django使用MySQL配置
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'mysite', # 使用MySQL时,需要提前在MySQL创建mysite数据库
        'HOST': '127.0.0.1',
        'PORT': 3306,
        'USER': 'root',
        'PASSWORD': '******'
    }
}

参数说明:

  • defaultDjango连接数据库时,默认链接 default下的数据库。
  • ENGINE:有多个可选值
  • django.db.backends.sqlite3
  • django.db.backends.postgresql
  • django.db.backends.mysql
  • django.db.backends.oracle
  • 其他第三方数据库后端。参考地址
  • NAME:数据库的名称。如果使用 SQLite,数据库将是电脑上的一个文件。默认值 BASE_DIR / 'db.sqlite3',将把数据库存储在项目的根目录。
  • 其他参数:如果不使用 SQLite,则必须添加一些额外设置,比如 USERPASSWORDHOST等等。参考文档

注意:如果使用 SQLite以外的数据库,需要确认在使用前已经创建了数据库。可以通过在你的数据库交互式命令行中使用 CREATE DATABASE database_name;来完成数据库的创建。

🌊 1.2 时区和语言

可以在 settings.py文件中,修改时区和语言。

语言
LANGUAGE_CODE = "zh-hans"
时区
TIME_ZONE = "Asia/Shanghai"

🌊 1.3 Django 默认的自带应用简介

settings.py文件中的一些说明: INSTALLED_APPS
INSTALLED_APPS 默认包括以下 Django 的自带应用:

  • django.contrib.admin:管理员站点
  • django.contrib.auth:认证授权系统
  • django.contrib.contenttypes:内容类型框架
  • django.contrib.sessions:会话框架
  • django.contrib.messages:消息框架
  • django.contrib.staticfiles:管理静态文件的框架

默认开启的某些应用需要至少一个数据表,所以,在使用它们之前需要在数据库中创建一些表。需要执行以下命令: python manage.py migrate

二、创建模型

定义模型,即数据库结构设计和附加元数据。

[En]

Define the model, that is, the database structure design and additional metadata.

在这个投票应用中,需要创建两个模型:问题 Question和选项 Choice

  • Question模型包括问题描述和发布时间。
  • Choice模型包括选项描述和当前得票数。每个选项属于一个问题。
polls/models.py
from django.db import models

class Question(models.Model):
    question_text = models.CharField(max_length=200)
    pub_date = models.DateTimeField("发布日期")

class Choice(models.Model):
    question = models.ForeignKey(Question, on_delete=models.CASCADE)
    choice_text = models.CharField(max_length=200)
    votes = models.IntegerField(default=0)

创建模型,继承 django.db.models.Model;每个模型有许多类变量,都表示模型里的一个数据表字段。

每个字段都是 Field类的实例。

说明:

  • Django可以为应用创建数据库表( CREATE TABLE
  • Django可以创建与 QuestionChoice对象进行交互的 Python数据库 API

三、激活模型

Django应用是”可插拔”的。

添加 polls应用

mysite/settings.py
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',

    'polls',
    # 或'polls.apps.PollsConfig',
]

现在, Django项目已经包含 polls应用。

运行命令 makemigrations,进行一次迁移: python manage.py makemigrations

运行 makemigrations命令, Django会检测模型文件的修改,并且把修改的部分存储为一次迁移。迁移是 Django对数据结构变化的一次存储。

migrate是自动执行数据库迁移并同步管理数据库结构的命令。

因此,执行 makemigrations之后,要想修改在数据库做出同步,需要再次执行 python manage.py migrate

迁移是非常强大的功能,能够在开发过程中持续的改变数据库结构而不需要删除表和重新创建表。
它专注于平稳的数据库升级,而不会丢失数据。

[En]

It focuses on smooth database upgrades without losing data.

改变模型需要以下步骤:

  • 编辑 models.py文件,改变模型
  • 运行 python manage.py makemigrateions 为模型的改变生成迁移文件
  • 运行 python manage.py migrate 应用数据库迁移

四、初试API

🌊 4.1 Django 交互式命令的基本使用

进入 Django交互式命令行: python manage.py shell

>>> from polls.models import Choice, Question
查看表Question表中的数据
>>> Question.objects.all()
 # 目前没有数据

>>> from django.utils import timezone
创建一个Question数据对象
>>> q = Question(question_text="What's new?", pub_date=timezone.now())
存储数据对象到数据库
>>> q.save()
查看 q 对象属性
>>> q.id
1
>>> q.question_text
"What's' new?"
>>> q.pub_date
datetime.datetime(2022, 3, 20, 11, 29, 15, 780052, tzinfo=datetime.timezone.utc)

修改 q 对象的属性
>>> q.question_text = "What's up?"
>>> q.save()

再次查看 Question 表中的数据
>>> Question.objects.all()
]>

对于 Question返回的显示数据,可以通过编辑 Question模型代码进行修改,给 QuestionChioce增加 __str__()方法。

class Question(models.Model):
    question_text = models.CharField(max_length=200)
    pub_date = models.DateTimeField("发布日期")

    def __str__(self):
        return self.question_text

class Choice(models.Model):
    question = models.ForeignKey(Question, on_delete=models.CASCADE)
    choice_text = models.CharField(max_length=200)
    votes = models.IntegerField(default=0)

    def __str__(self):
        return self.choice_text

再次进入Django交互式命令行: python manage.py shell

Question.objects.all()
<queryset [<question: what's up?>]>
</queryset>

🌊 4.2 给模型添加自定义方法

import datetime

from django.db import models
from django.utils import timezone

class Question(models.Model):
    question_text = models.CharField(max_length=200)
    pub_date = models.DateTimeField("发布日期")

    def __str__(self):
        return self.question_text

    def was_published_recently(self):
        return self.pub_date >= timezone.now() - datetime.timedelta(days=1)

class Choice(models.Model):
    question = models.ForeignKey(Question, on_delete=models.CASCADE)
    choice_text = models.CharField(max_length=200)
    votes = models.IntegerField(default=0)

    def __str__(self):
        return self.choice_text

再次进入Django交互式命令行: python manage.py shell

>>> from polls.models import Question, Choice

查看 __str__() 是否已生效
>>> Question.objects.all()
]>

Django database API:filter
>>> Question.objects.filter(id=1)
]>
>>> from django.utils import timezone
>>> current_year = timezone.now().year
>>> Question.objects.get(pub_date__year=current_year)

如果数据库中不存在任何数据,则会引发异常<details><summary>*<font color='gray'>[En]</font>*</summary>*<font color='gray'>If no data exists in the database, an exception is thrown</font>*</details>
>>> Question.objects.get(id=2)
Traceback (most recent call last):
  File "", line 1, in
  File "D:\Codes\media\django\code001\venv\lib\site-packages\django\db\models\manager.py", line 85, in manager_method
    return getattr(self.get_queryset(), name)(*args, **kwargs)
  File "D:\Codes\media\django\code001\venv\lib\site-packages\django\db\models\query.py", line 496, in get
    raise self.model.DoesNotExist(
polls.models.Question.DoesNotExist: Question matching query does not exist.

通过主键获取数据对象
>>> Question.objects.get(pk=1)

>>> q = Question.objects.get(pk=1)

使用 models.py 中自定义的方法
>>> q.was_published_recently()
True

查看 q 对象,外键所对应的对象
>>> q.choice_set.all()

给 q 对象添加外键元素
>>> q.choice_set.create(choice_text="Not much", votes=0)

>>> q.choice_set.create(choice_text="The sky", votes=0)

>>> c = q.choice_set.create(choice_text="Just hacking again", votes=0)

查看 c 元素(Choice 对象)
>>> c

查看 c 元素的属性
>>> c.question

查看 q 对象,外键所对应的对象
>>> q.choice_set.all()
, , ]>
>>> q.choice_set.count()
3

>>> Choice.objects.filter(question__pub_date__year=current_year)
, , ]>

>>> c = q.choice_set.filter(choice_text__startswith="Just hacking")
删除 c 对象
>>> c.delete()
(1, {'polls.Choice': 1})
>>> q.choice_set.all()
, ]>

五、 Djaong 管理界面

管理界面不是为网站访问者提供的,而是为管理人员提供的。

[En]

The management interface is not for visitors to the site, but for managers.

🌊 5.1 创建一个管理员帐号

在命令行运行以下命令: python manage.py createsuperuser
之后,系统将提示您输入用户名、邮箱、密码和确认密码。

[En]

After that, you will be prompted to enter your user name, mailbox, password, and confirm password.

> python manage.py createsuperuser
用户名 (leave blank to use 'administrator'): admin
电子邮件地址: admin@example.com
Password: ******
Password (again): ******
密码长度太短。密码必须至少包含8个字符。<details><summary>*<font color='gray'>[En]</font>*</summary>*<font color='gray'>The password length is too short. The password must contain at least 8 characters.</font>*</details>
这个密码太常见了。
密码只包含数字。
Bypass password validation and create user anyway? [y/N]: y
Superuser created successfully.

🌊 5.2 登录管理界面

启动开发服务器: python manage.py runserver
打开浏览器:http://127.0.0.1:8000/admin/
输入帐号和密码即可进入管理界面。

[En]

Enter your account number and password to enter the management interface.

【邂逅Django】——(二)数据库配置

【邂逅Django】——(二)数据库配置

🌊 5.3 向管理页面增加投票应用

polls/admin.py
from django.contrib import admin

from .models import Question

admin.site.register(Question)

【邂逅Django】——(二)数据库配置

🌊 5.4 体验便捷的管理功能

点击页面上的按钮可使用添加、删除、修改和搜索功能。

[En]

Click the button on the page to use the add, delete, modify and search function.

六、【 PyCharm 使用小技巧】

💎 6.1 使用 PyCharm 的工具运行 makemigrations & migrate

【邂逅Django】——(二)数据库配置

6.2 使用 PyCharm 运行 django shell

PyCharm底部工具栏,选择 Python Console即可进入 python manage.py shell

前提条件:项目启动 Django支持。
项目启动 Django支持见:【邂逅Django】——(一)创建项目 – CoderChaos – 博客园 (cnblogs.com)
四、【PyCharm 使用小技巧】

相比于从 Terminal通过 python manage.py shell进入 Django shell,输入会有一定的提示。

【邂逅Django】——(二)数据库配置

七、最简单的美化Django Admin

💎 7.1 simpleui 简介

Django Admin默认界面设计语言存在着的一些不足,比如色彩单一,大量线条的使用,分割化明显。将这些不足归类一下就是界面单调、雷同性明显、缺少惊喜。

simpleui:一款基于vue+element-ui的django admin现代化主题。

GitHub地址:https://github.com/newpanjing/simpleui

💎 7.2 simpleui 使用

✨ 7.2.1 安装

poetry add -D django-simpleui

✨ 7.2.2 开始使用

安装完成后,在自己项目的 settings.py文件中 INSTALLED_APPS&#x7B2C;&#x4E00;&#x884C;加入simpleui。

settings.py
INSTALLED_APPS = [
    'simpleui',

    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',

    'polls'
]

如果之前的服务仍在运行,只需刷新页面即可。

[En]

If the previous service is still running, just refresh the page.

【邂逅Django】——(二)数据库配置

【邂逅Django】——(二)数据库配置

总结

本文简单介绍了 Django与数据库的连接与使用,默认后台管理界面的使用。

以及使用 PyCharm快捷运行 makemigrations & migrate命令和 django shell,使用 django-simpleui美化默认后台管理界面。

Original: https://www.cnblogs.com/CoderChaos/p/16433491.html
Author: CoderChaos
Title: 【邂逅Django】——(二)数据库配置

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/499171/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • pandas DataFrame 用法–查看和选择数据

    目录 1. 使用 .head() 查看 DataFrame 头部数据 2. 使用 .tail() 查看 DataFrame 尾部数据 3. 使用 .describe() 查看 Da…

    Python 2023年8月7日
    030
  • pandas 数据结构–DataFrame

    DataFrame 是由多种类型的列构成的二维标签数据结构,类似于 Excel 、SQL 表,或 Series 对象构成的字典。DataFrame 是最常用的 Pandas 对象,…

    Python 2023年8月7日
    063
  • Numpy通用函数数组,线性代数

    Numpy通用函数 通用函数是一种对ndarry中的数据执行元素级运算的函数,可以看作是简单函数(接受一个或多个标量值,并产生一个或多个标量值)的矢量化包装器。 一元通用函数: 函…

    Python 2023年8月27日
    041
  • 第六章 应用pytest测试框架6.1-6.3章节

    感谢大家关注,帮忙分享呦,你们的阅读就是我的动力!!! 公众号:小李测试随笔 第六章 应用pytest测试框架6.1-6.3章节 pytest是一个非常成熟的全功能的python测…

    Python 2023年9月14日
    066
  • 灰色预测模型

    灰色预测模型一般用于给定的部分已知数据,预测未来的未知数据,例如根据前几天的天气预测未来天气,根据已有人口走向预测未来人口等等。这里主要介绍一阶一变量灰色预测模型,适用于单一变量的…

    Python 2023年9月27日
    039
  • python:DataFrame的创建以及DataFrame的属性

    一、DataFrame的创建 Pandas 的数据结构主要是:Series(一维数组),DataFrame(二维数组)。DataFrame是由索引和内容组成,索引既有行索引inde…

    Python 2023年8月1日
    044
  • canvas画布清空python_python在Tkinter FigureCanvasTkAgg中更新matplotlib动画,并从画布中清除循环动画…

    我试图用tkinter创建一个GUI,它向我显示我捕捉到的事件的动画,当我单击一个按钮时,下一个事件应该会显示出来。到目前为止,我的代码确实做到了这一点,但我遇到的问题是,当我单击…

    Python 2023年9月5日
    038
  • 机器学习笔记1————机器学习(科学计算库numpy)

    ​​​​​​Numpy(Numerical Python)是一个开源的Python科学计算库, 用于快速处理任意维度的数组。Numpy 支持常见的数组和矩阵操作。对于同样的数值计算…

    Python 2023年8月25日
    059
  • python-*arg,**kwargs在pytest中的使用

    本文章引自其他文章,这里主要讲下在pytest中封装接口的使用。详细的使用可以看下原文章:https://www.cnblogs.com/cwind/p/8996000.html简…

    Python 2023年9月14日
    042
  • Python制作词云

    参考的视频教程:https://www.bilibili.com/video/BV1ut4y1S7gP?p=3 1. 环境 python3.9PyCharm 需要的模块如下: wo…

    Python 2023年8月1日
    045
  • 集成学习-偏差与方差

    偏差与方差 偏差(Bias) 用所有可能的训练数据集训练出的所有模型的输出的平均值与真实模型的输出值之间的差异。含义:度量了学习算法的期望预测与真实结果的偏离程度,即刻画了学习算法…

    Python 2023年10月29日
    029
  • form表单上传文件及后端获取文件

    写在前面(强调) 使用form表单上传文件时必须要干的两件事: 1.form&#x8868;&#x5355;&#x7684;method&#x630…

    Python 2023年6月9日
    058
  • Java—泛型

    泛型出现的原因 Java的泛型是在JDK1.5开始才加上的。在此之前的Java是没有泛型的。没有泛型的Java使用起来给人感觉非常的笨重,为了体会泛型带来的好处,来看看如果没有泛型…

    Python 2023年10月23日
    026
  • pandas之汇总和计算描述统计

    2.1 sum()——值的总和 先创建一个DataFrame: import pandas as pd data = {‘name’: [‘apolo’, ‘adm’, ‘bolo…

    Python 2023年8月21日
    022
  • scrapy框架

    参考资料:https://blog.csdn.net/qq_37758925/article/details/108607592https://blog.csdn.net/weix…

    Python 2023年10月4日
    049
  • python基础知识笔记

    参考视频和资料:2022新版黑马程序员python教程,8天python从入门到精通,学python看这套就够了_哔哩哔哩_bilibili 最后有知识的思维导图! Python入…

    Python 2023年8月1日
    046
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球