草庐IT

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

CoderChaos 2023-04-18 原文

? 邂逅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()
<QuerySet []> # 目前没有数据

>>> 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()
<QuerySet [<Question: Question object (1)>]>

对于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?>]>

? 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()
<QuerySet [<Question: What's up?>]>

# Django database API:filter
>>> Question.objects.filter(id=1)
<QuerySet [<Question: What's up?>]>
>>> from django.utils import timezone
>>> current_year = timezone.now().year
>>> Question.objects.get(pub_date__year=current_year)
<Question: What's up?>

# 如果数据库中不存在数据,则会抛出异常
>>> Question.objects.get(id=2)
Traceback (most recent call last):
  File "<input>", line 1, in <module>
  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)
<Question: What's up?>
>>> q = Question.objects.get(pk=1)

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

# 查看 q 对象,外键所对应的对象
>>> q.choice_set.all()
<QuerySet []>

# 给 q 对象添加外键元素
>>> q.choice_set.create(choice_text="Not much", votes=0)
<Choice: Not much>
>>> q.choice_set.create(choice_text="The sky", votes=0)
<Choice: The sky>
>>> c = q.choice_set.create(choice_text="Just hacking again", votes=0)

# 查看 c 元素(Choice 对象)
>>> c
<Choice: Just hacking again>
# 查看 c 元素的属性
>>> c.question
<Question: What's up?>

# 查看 q 对象,外键所对应的对象
>>> q.choice_set.all()
<QuerySet [<Choice: Not much>, <Choice: The sky>, <Choice: Just hacking again>]>
>>> q.choice_set.count()
3

>>> Choice.objects.filter(question__pub_date__year=current_year)
<QuerySet [<Choice: Not much>, <Choice: The sky>, <Choice: Just hacking again>]>

>>> c = q.choice_set.filter(choice_text__startswith="Just hacking")
# 删除 c 对象
>>> c.delete()
(1, {'polls.Choice': 1})
>>> q.choice_set.all()
<QuerySet [<Choice: Not much>, <Choice: The sky>]>

五、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/
输入帐号和密码,即可进入管理界面。

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

# polls/admin.py
from django.contrib import admin

from .models import Question

admin.site.register(Question)

? 5.4 体验便捷的管理功能

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

六、【PyCharm使用小技巧】

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

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 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第一行加入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与数据库的连接与使用,默认后台管理界面的使用。

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

有关【邂逅Django】——(二)数据库配置的更多相关文章

  1. ruby - 解析 RDFa、微数据等的最佳方式是什么,使用统一的模式/词汇(例如 schema.org)存储和显示信息 - 2

    我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i

  2. ruby-on-rails - 独立 ruby​​ 脚本的配置文件 - 2

    我有一个在Linux服务器上运行的ruby​​脚本。它不使用rails或任何东西。它基本上是一个命令行ruby​​脚本,可以像这样传递参数:./ruby_script.rbarg1arg2如何将参数抽象到配置文件(例如yaml文件或其他文件)中?您能否举例说明如何做到这一点?提前谢谢你。 最佳答案 首先,您可以运行一个写入YAML配置文件的独立脚本:require"yaml"File.write("path_to_yaml_file",[arg1,arg2].to_yaml)然后,在您的应用中阅读它:require"yaml"arg

  3. Ruby Sinatra 配置用于生产和开发 - 2

    我已经在Sinatra上创建了应用程序,它代表了一个简单的API。我想在生产和开发上进行部署。我想在部署时选择,是开发还是生产,一些方法的逻辑应该改变,这取决于部署类型。是否有任何想法,如何完成以及解决此问题的一些示例。例子:我有代码get'/api/test'doreturn"Itisdev"end但是在部署到生产环境之后我想在运行/api/test之后看到ItisPROD如何实现? 最佳答案 根据SinatraDocumentation:EnvironmentscanbesetthroughtheRACK_ENVenvironm

  4. ruby - Ruby 有 `Pair` 数据类型吗? - 2

    有时我需要处理键/值数据。我不喜欢使用数组,因为它们在大小上没有限制(很容易不小心添加超过2个项目,而且您最终需要稍后验证大小)。此外,0和1的索引变成了魔数(MagicNumber),并且在传达含义方面做得很差(“当我说0时,我的意思是head...”)。散列也不合适,因为可能会不小心添加额外的条目。我写了下面的类来解决这个问题:classPairattr_accessor:head,:taildefinitialize(h,t)@head,@tail=h,tendend它工作得很好并且解决了问题,但我很想知道:Ruby标准库是否已经带有这样一个类? 最佳

  5. ruby - 我如何添加二进制数据来遏制 POST - 2

    我正在尝试使用Curbgem执行以下POST以解析云curl-XPOST\-H"X-Parse-Application-Id:PARSE_APP_ID"\-H"X-Parse-REST-API-Key:PARSE_API_KEY"\-H"Content-Type:image/jpeg"\--data-binary'@myPicture.jpg'\https://api.parse.com/1/files/pic.jpg用这个:curl=Curl::Easy.new("https://api.parse.com/1/files/lion.jpg")curl.multipart_form_

  6. 世界前沿3D开发引擎HOOPS全面讲解——集3D数据读取、3D图形渲染、3D数据发布于一体的全新3D应用开发工具 - 2

    无论您是想搭建桌面端、WEB端或者移动端APP应用,HOOPSPlatform组件都可以为您提供弹性的3D集成架构,同时,由工业领域3D技术专家组成的HOOPS技术团队也能为您提供技术支持服务。如果您的客户期望有一种在多个平台(桌面/WEB/APP,而且某些客户端是“瘦”客户端)快速、方便地将数据接入到3D应用系统的解决方案,并且当访问数据时,在各个平台上的性能和用户体验保持一致,HOOPSPlatform将帮助您完成。利用HOOPSPlatform,您可以开发在任何环境下的3D基础应用架构。HOOPSPlatform可以帮您打造3D创新型产品,HOOPSSDK包含的技术有:快速且准确的CAD

  7. FOHEART H1数据手套驱动Optitrack光学动捕双手运动(Unity3D) - 2

    本教程将在Unity3D中混合Optitrack与数据手套的数据流,在人体运动的基础上,添加双手手指部分的运动。双手手背的角度仍由Optitrack提供,数据手套提供双手手指的角度。 01  客户端软件分别安装MotiveBody与MotionVenus并校准人体与数据手套。MotiveBodyMotionVenus数据手套使用、校准流程参照:https://gitee.com/foheart_1/foheart-h1-data-summary.git02  数据转发打开MotiveBody软件的Streaming,开始向Unity3D广播数据;MotionVenus中设置->选项选择Unit

  8. Vscode+Cmake配置并运行opencv环境(Windows和Ubuntu大同小异) - 2

    之前在培训新生的时候,windows环境下配置opencv环境一直教的都是网上主流的vsstudio配置属性表,但是这个似乎对新生来说难度略高(虽然个人觉得完全是他们自己的问题),加之暑假之后对cmake实在是爱不释手,且这样配置确实十分简单(其实都不需要配置),故斗胆妄言vscode下配置CV之法。其实极为简单,图比较多所以很长。如果你看此文还配不好,你应该思考一下是不是自己的问题。闲话少说,直接开始。0.CMkae简介有的人到大二了都不知道cmake是什么,我不说是谁。CMake是一个开源免费并且跨平台的构建工具,可以用简单的语句来描述所有平台的编译过程。它能够根据当前所在平台输出对应的m

  9. 使用canal同步MySQL数据到ES - 2

    文章目录一、概述简介原理模块二、配置Mysql使用版本环境要求1.操作系统2.mysql要求三、配置canal-server离线下载在线下载上传解压修改配置单机配置集群配置分库分表配置1.修改全局配置2.实例配置垂直分库水平分库3.修改group-instance.xml4.启动监听四、配置canal-adapter1修改启动配置2配置映射文件3启动ES数据同步查询所有订阅同步数据同步开关启动4.验证五、配置canal-admin一、概述简介canal是Alibaba旗下的一款开源项目,Java开发。基于数据库增量日志解析,提供增量数据订阅&消费。Git地址:https://github.co

  10. ruby-on-rails - 创建 ruby​​ 数据库时惰性符号绑定(bind)失败 - 2

    我正在尝试在Rails上安装ruby​​,到目前为止一切都已安装,但是当我尝试使用rakedb:create创建数据库时,我收到一个奇怪的错误:dyld:lazysymbolbindingfailed:Symbolnotfound:_mysql_get_client_infoReferencedfrom:/Library/Ruby/Gems/1.8/gems/mysql2-0.3.11/lib/mysql2/mysql2.bundleExpectedin:flatnamespacedyld:Symbolnotfound:_mysql_get_client_infoReferencedf

随机推荐