2

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

 1 year ago
source link: https://blog.51cto.com/u_15655776/5433187
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

🔥 邂逅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的技术博客_51CTO博客

一、项目配置文件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
电子邮件地址: [email protected]
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
【邂逅Django】——(二)数据库配置_数据库_02

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

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

from .models import Question

admin.site.register(Question)
【邂逅Django】——(二)数据库配置_django_03

🌊 5.4 体验便捷的管理功能

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

六、【PyCharm使用小技巧】

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

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

6.2 使用PyCharm运行django shell

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

前提条件:项目启动Django支持。

项目启动Django支持见: 【邂逅Django】——(一)创建项目_CoderChaos的技术博客_51CTO博客

四、【PyCharm 使用小技巧】

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

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

七、最简单的美化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】——(二)数据库配置_django_06
【邂逅Django】——(二)数据库配置_python_07

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

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


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK