【邂逅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能够有一个清晰的认识。

路漫漫兮其修远兮,吾将上下而求索!

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

二、创建模型

定义模型,也就是数据库结构设计和附加的其他元数据。

在这个投票应用中,需要创建两个模型:问题 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

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

改变模型需要以下步骤:

  • 编辑 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)

如果数据库中不存在数据,则会抛出异常
>>> 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 管理界面

管理界面不是为了网站的访问者,而是为管理者准备的。

🌊 5.1 创建一个管理员帐号

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

> python manage.py createsuperuser
用户名 (leave blank to use 'administrator'): admin
电子邮件地址: admin@example.com
Password: ******
Password (again): ******
密码长度太短。密码必须包含至少 8 个字符。
这个密码太常见了。
密码只包含数字。
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/
输入帐号和密码,即可进入管理界面。

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

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

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

polls/admin.py
from django.contrib import admin

from .models import Question

admin.site.register(Question)

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

🌊 5.4 体验便捷的管理功能

点击页面中的按钮,即可使用增删改查功能。

六、【 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'
]

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

【邂逅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/713256/

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

(0)

大家都在看

  • 阿里云OSS + PicGo搭建图床

    配置 PicGo 下载安装完成后,打开 PicGo,配置阿里云 OSS。 其中,KeyId 即创建 RAM 用户的 AccessKey ID,KeySecret 即 AccessK…

    技术杂谈 2023年7月11日
    065
  • linux多路转接select—服务器代码

    一、linux多路转接select—服务器代码 #include #include #include #include<string.h> #include…

    技术杂谈 2023年7月10日
    065
  • HDU 4833 Best Financing (DP)

    Time Limit: 20000/10000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Su…

    技术杂谈 2023年5月30日
    079
  • MySql主要性能指标说明

    在项目当中数据库一般都会成为主要的性能与负载瓶颈,那么针对数据库各项性能指标的监控与对应的优化是开发与运维人员需要面对的主要工作,而且这部分的工作会贯穿项目从开发到运行的整个周期里…

    技术杂谈 2023年7月25日
    059
  • 精通正则表达式系列

    这是正则表达式从入门学习到深入掌握各种技巧的教程系列,使用了不同语言描述,但对于正则理念来说是完全通用的。最后还差一篇正则性能优化的文章,有机会再补上。 我已经录了正则表达式的两门…

    技术杂谈 2023年5月31日
    0114
  • 图床是什么?如何使用图床?

    图床其实是互联网中存储图片的空间,举个栗子: 假设你在微博分享一张图片,你的粉丝可以通过互联网看到你分享的图片,那么他是去访问你的手机的相册吗?其实不是的,你分享图片,也就是把图片…

    技术杂谈 2023年7月25日
    079
  • 手把手教你用JAVA实现“语音识别”功能(声音转文字)标贝科技

    手把手教你用JAVA实现”语音识别”功能(声音转文字)标贝科技 前言 什么是语音识别?将自然语音转换为文本信息,本篇文章将介绍”一句话识别&#8…

    技术杂谈 2023年7月25日
    077
  • 什么是计算机?

    计算机 组成:硬件+软件能按程序运行,自动、告诉处理海量数据的现代化智能电子设备。应用:科学计算、数据处理、自动控制、计算机辅助设计、人工智能、网络(互联网、自己的计算机就是网络的…

    技术杂谈 2023年7月11日
    072
  • 【翻译】SpringSecurity抛弃了WebSecurityConfigurerAdapter

    作者:ELEFTHERIA STEIN-KOUSATHANA 发表日期:2022年2月21日 在Spring Security 5.7.0-M2,我们弃用了 WebSecurity…

    技术杂谈 2023年7月24日
    084
  • 使用Apache POI导出echarts图表到Excel表格

    转自:https://blog.csdn.net/weixin_44009447/article/details/105794496 引言:在实际项目统计报表模块中,报表的内容不单…

    技术杂谈 2023年5月31日
    0107
  • 香一下子

    一年了 ,希望自己不要没事就emo了,工作生活平衡一下子。 Original: https://www.cnblogs.com/deepSleeping/p/16847104.ht…

    技术杂谈 2023年7月25日
    084
  • ES5 数据属性描述符和存取描述符

    一、数据属性描述符 对象是一个属性集合,对象的基本特征是属性名(name)和属性值(value)。ES5 增加了属性描述符,可以更细腻的控制属性的不同操作。属性描述符有 confi…

    技术杂谈 2023年6月1日
    077
  • 读《软件测试的艺术》——第一章

    《软件测试的艺术》作为元老级别的测试理论书籍,在业内非常经典且有口皆碑,书中提出的 软件测试为求错而非求证的观点至今仍在学术界被广泛讨论。本书还为计算机界一个最为重要的主题提供了一…

    技术杂谈 2023年7月11日
    060
  • 从磁盘删除Ubuntu出现的问题

    问题描述:Win10+Ubuntu双系统,利用磁盘管理工具删除了Ubuntu占用的磁盘,导致开机直接进入Grub界面,并且启动项仍有Ubuntu。 问题解决: 开机进入BIOS或启…

    技术杂谈 2023年7月25日
    092
  • Docker-网络模式

    Docker-网络模式 1.Docker网络模式概述 Docker使用Linux桥接,在宿主机虚拟一个Docker容器网桥(docker0),Docker启动一个容器时会根据Doc…

    技术杂谈 2023年7月10日
    085
  • 小i机器人

    php;gutter:true; //机器人回复 function xiaoirobot($openid, $content) { //定义app $app_key = &quot…

    技术杂谈 2023年5月31日
    079
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球