Django的基础学习二: 数据库(Seeting)设置

本文详细介绍了Django项目的数据库设置,包括默认的SQLite配置和如何切换到MySQL。讲解了ORM的概念,并提供了数据库迁移的步骤,从创建模型到执行迁移。此外,还讨论了Django时间坑,强调了时区的正确使用。最后,介绍了如何创建和激活模型,以及Django管理站点的创建和使用。
摘要由CSDN通过智能技术生成

@[TOC](

数据库(Seeting)

打开mysite/settings.py。这是一个普通的Python模块,其中模块级变量代表Django设置。
默认情况下,配置使用SQLite。如果是数据库的新手,或者只是想尝试Django,这是最简单的选择。SQLite包含在Python中,因此无需安装任何其他东西来支持你的数据库。
mysql连接用户名 密码,项目大型后会有很多配置,如果写在每一个py脚本中将会产生重复代码,解决方案是在py.json配置文件声明键值对变量,其他各个py脚本配置变量习惯上全大写字母命名

数据库配置

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    }
}

默认sqlite,其他详见settings.py

"""
Django settings for mysite project.

Generated by 'django-admin startproject' using Django 2.2.3.

For more information on this file, see
https://docs.djangoproject.com/en/2.2/topics/settings/

For the full list of settings and their values, see
https://docs.djangoproject.com/en/2.2/ref/settings/
"""

import os

# Build paths inside the project like this: os.path.join(BASE_DIR, ...)
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))


# Quick-start development settings - unsuitable for production
# See https://docs.djangoproject.com/en/2.2/howto/deployment/checklist/

# SECURITY WARNING: keep the secret key used in production secret!
# 会话    表单 加密加盐使用
SECRET_KEY = 'aak80mo4#ge6krhpr_ocp6f6=mz^$(l0@@z$dogffu=^0)8avu'

# SECURITY WARNING: don't run with debug turned on in production!
# 开发模式,代码变更服务器重新启动
DEBUG = True

# 允许哪些客户端来访问你,  '*'代表上线后所有人都可以访问
ALLOWED_HOSTS = []


# Application definition
# 应用定义,例如我们自己的应用polsss  服务启动时会自动扫描下面配置加载的模块,看数据库表是否生成.没有写或注释的模块路径不加载.
# 1.加载urls
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',   # 找不到'statiles polsss'包,应该是少写逗号
    # 自定义应用
    'polsss'      # 或'polsss.apps.PolsssConfig'
]

# http请求经过一些预处理,    会话安全,表单安全,权限验证等.
MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

# 路由入口
ROOT_URLCONF = 'mysite.urls'

# html模板
TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [],
        # 'DIRS':['tempoate',],     # 扫描到项目根目录下temp下的html模板文件夹位置
        'APP_DIRS': True,       # 扫描到app下templates文件夹下的html文件
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]

# 通过网关接口,部署相关
WSGI_APPLICATION = 'mysite.wsgi.application'


# Database
# https://docs.djangoproject.com/en/2.2/ref/settings/#databases
# 数据库
DATABASES = {
    'default': {
        # 'ENGINE':'mysql.connector.diango',    # 对应驱动mysql connector/python.exe安装包
        'ENGINE': 'django.db.backends.mysql',  # 对应MySQLclient , django2.2 暂不支持mysql8.0版本
        'NAME': 'django_test',  # database/schem名
        'USER': 'root',
        'PASSWORD': '123456',
        'HOST': '127.0.0.1',
        'PORT': '3306',
        'OPTIONS': {
            # 'read_default_file': '/path/to/my.cnf',
        },
    }
    # 'default': {
    #     'ENGINE': 'django.db.backends.sqlite3',
    #     'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    # }
}


# Password validation
# https://docs.djangoproject.com/en/2.2/ref/settings/#auth-password-validators
# 自带的权限密码验证
AUTH_PASSWORD_VALIDATORS = [
    {
        'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
    },
]


# Internationalization
# https://docs.djangoproject.com/en/2.2/topics/i18n/
# 国际化
LANGUAGE_CODE = 'zh-hans'     # 语言 = 英文-美国 zh-hans 简体中文   zh-cn已不被支持  会影响报错页面  默认en-us

TIME_ZONE = 'Asia/Shanghai'   # 开启时区  Asia/Shanghai   UTC GTM+8   默认UTC

USE_I18N = True     # 通过配置文件,如果国外ip访问,更改菜单文字为英文.

USE_L10N = True

USE_TZ = True       # 通过配置文件,如果国外ip访问,更改菜单文字为英文.



# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/2.2/howto/static-files/

STATIC_URL = '/static/'

ORM

文档位置 模型层-supported database ,http://d.u753.com/ref/databases.html
配置settings-database http://d.u753.com/ref/settings.html#std:setting-NAME
mysql:
1.官方推荐驱动mysqlclient
pip install mysqlclient
2.确认字符集为utf-8
登录

'default': {
        'ENGINE': 'mysql.connector.django',   # 对应驱动 mysql connector/python .exe安装包
        # 'ENGINE': 'django.db.backends.mysql',   # 对应 mysqlclient ,django2.2暂时不支持mysql8.0版本
        'NAME': 'django_test',  # database/schema 名
        'USER': '你的计算机名字',
        'PASSWORD': '你的密码',
        'HOST': '127.0.0.1',
        'PORT': '3306',
        'OPTIONS': {
            # 'read_default_file': '/path/to/my.cnf',
        },
    }

迁移

1.model.py 用类的方式定义表结构
2.想要使用和生成表结构的app需要先加入到settings中的installed_apps
3.生成sqlpython manage.py makemigrations [app_name]生成的迁移脚本在migrations文件夹下
3.(可选) python manage.py sqlmigrate [appname] [sqlNo]看sql语句
4.执行sql python manage.py migrate
5.成功后会在数据库中看到生成的表 django_migrations表记录迁移的过程

如果要使用其他数据库,请安装相应的数据库绑定并更改项中的以下键 以匹配数据库连接设置:DATABASES’default’
ENGINE要么 ‘django.db.backends.sqlite3’, ‘django.db.backends.postgresql’,‘django.db.backends.mysql’,或 ‘django.db.backends.oracle’。其他后端也可用。

NAME: 数据库的名称。如果使用的是SQLite,则数据库将是计算机上的文件; 在这种情况下,NAME 应该是该文件的完整绝对路径,包括文件名。默认值, 将文件存储在项目目录中。os.path.join(BASE_DIR,‘db.sqlite3’)
在编辑时mysite/settings.py,请设置TIME_ZONE为你的时区。
另请注意INSTALLED_APPS文件顶部的设置。它包含在这个Django实例中激活的所有Django应用程序的名称。应用程序可以在多个项目中使用,你可以打包和分发它们以供项目中的其他人使用。

默认情况下,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
在这里插入图片描述
migrate命令查看INSTALLED_APPS设置并根据mysite/settings.py文件中的数据库设置和应用程序附带的数据库迁移创建任何必要的数据库表。将看到适用于每次迁移的消息。运行数据库的命令行客户端并键入\dt以显示Django创建的表.

创建模型:

模型是关于数据的单一,明确的真实来源。它包含你要存储的数据的基本字段和行为。Django遵循DRY原则。目标是在一个地方定义你的数据模型,并自动从中获取数据。
这包括迁移,例如,迁移完全来自你的模型文件,并且基本上只是Django可以通过更新数据库模式以匹配你当前模型的历史记录。
将创建两个模型:Question和Choice。A Question有问题和出版日期。A Choice有两个字段:选择的文本和投票记录。每个Choice都与a相关联Question。
编辑 polls/models.py文件,使其如下所示:
在这里插入图片描述
代码很简单。每个模型由一个子类表示django.db.models.Model。每个模型都有许多类变量,每个变量代表模型中的数据库字段。
每个字段由Field 类的实例表示- 例如,CharField用于字符字段和 DateTimeField日期时间。这告诉Django每个字段包含哪种类型的数据。
每个Field实例的名称(例如 question_text或pub_date)是字段名称。你将在Python代码中使用此值,并且你的数据库将使用它作为列名称。
你可以使用可选的第一个位置参数 Field来指定一个类可读的名称。这在Django的几个内省部分中使用,并且它兼作文档。如果未提供此字段,Django将使用机器可读的名称。在这个例子中,我们只定义了一个人类可读的名称Question.pub_date。对于此模型中的所有其他字段,字段的机器可读名称就足以作为其可读的名称。
有些Field类需要参数。 CharField例如,要求你给它一个 max_length。这不仅在数据库模式中使用,而且在验证中使用。
A Field也可以有各种可选参数; 在这种情况下,我们将default值 设置votes为0。
注意使用的定义关系 ForeignKey。这告诉Django每个Choice都与单个相关Question。Django支持所有常见的数据库关系:多对一,多对多和一对一。

激活模型:

要在我们的项目中包含应用程序,我们需要在设置中添加对其配置类的引用INSTALLED_APPS。该PollsConfig是在polls/apps.py文件中,所以它的虚线路径’polls.apps.PollsConfig’。编辑mysite/settings.py文件并将该虚线路径添加到INSTALLED_APPS设置中。它看起来像这样:

# 应用定义,例如我们自己的应用polsss  服务启动时会自动扫描下面配置加载的模块,看数据库表是否生成.没有写或注释的模块路径不加载.
# 1.加载urls
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',   # 找不到'statiles polsss'包,应该是少写逗号
    # 自定义应用
    'polsss'      # 或'polsss.apps.PolsssConfig'
]

现在Django知道要包含该polls应用程序。运行另一个命令:
python manage.py makemigrations polsss
在这里插入图片描述
在这里插入图片描述
将sqlmigrate命令获取迁移名称并返回其SQL:

python manage.py sqlmigrate polls 0001
在这里插入图片描述

django中的时间坑

数据库中存的都是UTC时间标准,而中国是8+时区
py内置包datetime不包含时区属性会导致错误
要用djaogo.utils的timezone.now()生成时间
最后前台html渲染时会根据settings中的时区配置加上相应的8小时

系统检测:pythonmanage.py check
在这里插入图片描述
系统检查没有发现任何问题(0静音)。
migrate再次运行以在数据库中创建这些模型表:
python manage.py sqlmigrate polls 0001
在这里插入图片描述

请记住进行模型更改的三步指南:

1.更改模型(in models.py)。
2.运行以创建这些更改的迁移python manage.py makemigrations
3.运行以将这些更改应用于数据库。python manage.py migrate
在这里插入图片描述

使用:

跳进交互式Python shell。要调用Python shell,请使用以下命令:
python manage.py shell

我们使用它而不是简单地键入“python”,因为manage.py 设置了DJANGO_SETTINGS_MODULE环境变量,这为Django提供了mysite/settings.py文件的Python导入路径。
进入shell后,浏览数据库:
from polls.models import Choice, Question

导入我们刚刚编写的模型类。
然后给系统中添加问题.此时系统中还没有问题.
Question.objects.all() 显示所有问题
应该创造一个新的问题。
默认设置文件中启用了对时区的支持,因此Django希望为pub_date提供一个带有时区信息对象的datetime。使用timezone.now ()
from django.utils import timezone
q = Question(question_text="今天你学习了没?", pub_date=timezone.now())
将对象保存到数据库中。必须显式地调用save()。
q.save() 提交
现在它有一个ID。
q.id 输出:1
通过Python属性访问模型字段值。
q.question_text
输出:“你今天学习了没?”
q.pub_date
输出:datetime.datetime(2019, 7, 13, 2, 6, 9, 581245, tzinfo=)通过更改属性来更改值,然后调用save()
q.question_text = "你今天怎么了?"
q.save()
显示数据库中的所有问题。objects.all()
Question.objects.all()
输出:<QuerySet [<Question: Question object (1)>]>
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
str()向模型添加方法非常重要,不仅是为了在处理交互式提示时的方便,还因为在Django自动生成的管理中使用了对象的表示。
在polsss中输入:
在这里插入图片描述
exit() 退出

保存这些更改并通过再次运行启动新的Python交互式shell :
python manage.py shell
from polls.models import Choice, Question 确保我们添加的_str__()有效。
Question.objects.all() 输出问题:<QuerySet [<Question: 你今天怎么了?>]>
Django提供了一个完全由关键字参数驱动的富数据库查找API。
Question.objects.filter(id=1) 输出问题:<QuerySet [<Question: 你今天怎么了?>]>
根据关键字查找:
Question.objects.filter(question_text__startswith='你今天')
输出:<QuerySet [<Question: 你今天怎么了?>]>
根据时间查找:
from django.utils import timezone
current_year = timezone.now().year
Question.objects.get(pub_date__year=current_year)
current_year:本年度
输出:<Question: 你今天怎么了?>
请求一个不存在的ID,这将引发异常。
Question.objects.get(id=2)
Traceback (most recent call last):

DoesNotExist: Question matching query does not exist. 不存在问题匹配查询。
按主键查找是最常见的情况,因此Django为主键精确查找提供了快捷方式。
Question.objects.get(pk=1)
<Question: 你今天怎么了?>
确保自定义方法有效。
q = Question.objects.get(pk=1) q = Question.objects.get(id=1)
q.was_published_recently() 输出:True
给问题几个选项。create调用构造一个新的选择对象,执行INSERT语句,将选择添加到可用选择集中并返回新的选择对象。Django createsa设置为持有一个外键关系的“另一边”(例如。可以通过API访问。
q = Question.objects.get(pk=1)
显示相关对象集中的任何选项——目前还没有。
q.choice_set.all() 输出:<QuerySet []>
创建三个选择。
q.choice_set.create(choice_text='头疼', votes=0)
输出:<Choice: Not much>
q.choice_set.create(choice_text='感冒', votes=0)
输出:<Choice: The sky>
c = q.choice_set.create(choice_text='牙疼', votes=0)
选择对象具有对其相关问题对象的API访问权。
c.question 输出:<Question: 你今天怎么了?>
Question对象可以访问Choice对象。
q.choice_set.all()
<QuerySet [<Choice: Not much>, <Choice: The sky>, <Choice: Just hacking again>]>
q.choice_set.count() 输出:3
API会根据您的需要自动跟踪关系。使用双下划线分隔关系。你想要多深就有多深;是没有限制的。找到pub_date在今年的任何问题的所有选项(重用上面创建的’current_year’变量)。
Choice.objects.filter(question__pub_date__year=current_year)
输出:<QuerySet [<Choice: Not much>, <Choice: The sky>, <Choice: Just hacking again>]>
删除其中一个选项使用delete()。
c = q.choice_set.filter(choice_text__startswith='Just hacking')
c.delete()
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

Django管理员

为了你方便员工或客户生成管理站点以添加,更改和删除内容是繁琐的工作,不需要太多的创造力。因此,Django完全自动化为模型创建管理界面。
Django是在新闻编辑室环境中编写的,“内容发布者”和“公共”网站之间有明显的分离。站点管理员使用该系统添加新闻报道,事件,体育比分等,并且该内容显示在公共站点上。Django解决了为站点管理员创建统一界面以编辑内容的问题。
管理员不打算由网站访问者使用。它适用于网站管理员。

创建管理员用户

首先,我们需要创建一个可以登录管理站点的用户。运行以下命令:
python manage.py createsuperuser
输入所需的用户名,然后按Enter键。
Username: admin
然后,系统将提示您输入所需的电子邮件地址:
Email address: admin@example.com
最后一步是输入密码。系统会要求您输入两次密码,第二次输入密码作为第一次确认。
Password: **********
Password (again): *********
Superuser created successfully.
启动开发服务器
Django管理站点默认激活。让我们启动开发服务器并进行探索。
如果服务器没有运行,请启动它:
python manage.py runserver
现在,打开Web浏览器并转到本地域的“/ admin /” 例如,http://127.0.0.1:8000 / admin / 。应该看到管理员的登录屏幕:

由于默认情况下打开翻译,因此登录屏幕可能会以自己的语言显示,具体取决于你的浏览器设置以及Django是否有此语言的翻译。
进入管理站点
现在,尝试使用你在上一步中创建的超级用户帐户登录。你应该看到Django管理员索引页面:

你应该看到几种类型的可编辑内容:组和用户。它们django.contrib.auth由Django 提供的身份验证框架提供。
使管理中的民意调查应用可修改
但是我们的投票应用程序在哪里?它不会显示在管理员索引页面上。
只需做一件事:我们需要告诉管理员Question 对象有一个管理界面。为此,请打开该polls/admin.py 文件,然后将其编辑为如下所示:
Polsss/ admin.py
from django.contrib import admin
from .models import Question
admin.site.register(Question)
探索免费的管理功能
现在我们已经注册了Question,Django知道它应该显示在管理员索引页面上:
单击“问题”。现在,将进入“更改列表”页面以查询问题。此页面显示数据库中的所有问题,并允许选择一个更改它。我们之前创建的是“你今天怎么了?”问题:
点击“你今天怎么了?”问题进行编辑:

这里要注意的事项:

  1. 表单是从Question模型自动生成的。
  2. 不同的模型字段类型(DateTimeField, CharField)对应于相应的HTML输入窗口小部件。每种类型的字段都知道如何在Django管理员中显示自己。
  3. 每个都DateTimeField获得免费的JavaScript快捷方式。日期获得“今日”快捷方式和日历弹出窗口,时间获得“现在”快捷方式和方便的弹出窗口,列出常用的输入时间。

页面底部为你提供了选项:

  1. 保存 - 保存更改并返回此类对象的更改列表页面。
  2. 保存并继续编辑 - 保存更改并重新加载此对象的管理页面。
  3. 保存并添加另一个 - 保存更改并为此类对象加载新的空白表单。
  4. 删除 - 显示删除确认页面。

如果“发布日期”的值与你创建问题的时间不匹配,则可能意味着你忘记为该TIME_ZONE设置设置正确的值。更改它,重新加载页面并检查是否显示正确的值。
单击“今天”和“立即”快捷方式更改“发布日期”。然后单击“保存并继续编辑”。然后单击右上角的“历史记录”。将看到一个页面,其中列出了通过Django管理员对此对象所做的所有更改,以及进行更改的人员的时间戳和用户名.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值