关于python:邂逅Django二数据库配置

9次阅读

共计 7974 个字符,预计需要花费 20 分钟才能阅读完成。

🔥 邂逅 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 – 虚拟环境】我的项目的启动,从隔离开发环境开始 – SegmentFault 思否

一、我的项目配置文件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】——(一)创立我的项目 – SegmentFault 思否

四、【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 丑化默认后盾治理界面。

正文完
 0