Django 2.1.6.学习初级篇(2)

目录

No. 1 数据库设置

No. 2 创建模型

No. 3 激活模型

No. 4 使用Django提供的免费API

No. 4 介绍Django后台管理


No. 1 数据库设置

打开 mysite/settings.py文件,找到数据库设置地方,如下图

 

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

这是django自带的小型数据库sqlite。如果您希望使用其他数据库,请安装适当的数据库绑定,并更改数据库“默认”项中的下列键,以匹配您的数据库连接设置,解释一下上述参数:

ENGINE –不同的数据库对应不同的ENGINE,大概就这几种'django.db.backends.sqlite3''django.db.backends.postysql',  'django.db.backends.oracle','django.db.backends.mysql',当然其它一些后端如:Microsoft SQL ServerODBC也能用。

NAME –这个就是数据库的名称。如果使用SQLite,数据库将是计算机上的一个文件;在这种情况下,名称应该是该文件的完整绝对路径,包括文件名。默认值os.path。join(BASE_DIR, 'db.sqlite3')将文件存储在项目目录中。

当然,如果不使用SQLite作为数据库,则必须添加其他设置,如用户、密码和主机。

当连接到其他数据库后端(如MySQL、Oracle或PostgreSQL)时,将需要额外的连接参数。有关如何指定其他数据库类型,请参见下面的引擎设置。这个例子是为MYSQL:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql', # 数据库不同,engine不同
        'NAME': 'mydatabase', # 数据库名称
        'USER': 'mydatabaseuser', # 用户名
        'PASSWORD': 'mypassword', # 密码
        'HOST': '127.0.0.1', # IP
        'PORT': '3306', # 端口
    }
}

除了上面,你还需要下载pysql模块来连接mysql数据库,终端下运行

pip install pymysql

这样还没完成,还需要在mysite/__init__.py上加上:

import pymysql
pymysql.install_as_MySQLdb()

什么原因,Python在连接MySQL的模块里面,Python2的mysqldb模块在Python3叫pymsql模块,django框架还是识别python2的mysqldb模块。

在 mysite/settings.py中, TIME_ZONE变量设置你的时区

TIME_ZONE = 'Asia/Shanghai' # 中国时区

另外,注意文件顶部的INSTALLED_APPS设置。它保存在这个Django实例中激活的所有Django应用程序的名称。应用程序可以在多个项目中使用,您可以打包和分发它们,供其他人在其项目中使用。

INSTALLED_APPS = [
    '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中的数据库设置创建任何必要的数据库表

No. 2 创建模型

模型是数据真实性的唯一、确定的来源。它包含要存储的数据的基本字段和行为。

在我们的polls应用程序中,我们将创建两个模型:问题和选择。一个问题有一个问题和一个发布日期。一个选项有两个字段:选择的文本和投票计数。每个选择都与一个问题相关。这些概念由简单的Python类表示。编辑 polls/models.py 文件是这样的:

from django.db import models


class Question(models.Model):
    question_text = models.CharField(max_length=200)
    pub_date = models.DateTimeField('date published')


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表示。每个模型都有许多类变量,每个类变量表示模型中的一个数据库字段。

就拿类Question来说,迁移到数据库中就是一张表。question_text,pub_date就是表中的列,因为Question继承了models.Model,该表还有一个主键id列,自动增加。表中每列在加上数据类型限制,例如,votes = models.IntegerField(default=0),表示在表Choice中,有一列名称为votes,必须输入为整数,默认值为0。

最后,注意使用ForeignKey定义了一个关系。这告诉Django每个选项都与单个问题相关。Django支持所有常见的数据库关系:多对一、多对多和一对一。

No. 3 激活模型

要将该应用程序包含在我们的项目中,我们需要在INSTALLED_APPS设置中添加对其配置类的引用。PollsConfig类在poll /apps中。它的点路径是'polls.app.pollsconfig '。编辑mysite /setting.py,并将该点路径添加到INSTALLED_APPS设置中。它看起来是这样的:

mysite/settings.py

INSTALLED_APPS = [
    'polls.apps.PollsConfig',
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
]

现在Django知道polls应用程序,让我们运行另一个命令:

$ python manage.py makemigrations polls

您应该会看到类似于以下内容:

Migrations for 'polls':
  polls/migrations/0001_initial.py:
    - Create model Choice
    - Create model Question
    - Add field question to choice

通过运行makmigration,您告诉Django您已经对模型做了一些更改(在本例中,您已经做了一些新的更改),并且您希望将这些更改存储为迁移。

迁移是Django存储对模型(以及数据库模式)的更改的方式——它们只是磁盘上的文件。如果您愿意,可以阅读新模型的迁移;它是文件poll /migration /0001_initial.py。不要担心,您不需要每次Django生成一个时都阅读它们,但是如果您想手动调整Django的更改方式,那么它们是可编辑的。

有一个命令将为您运行迁移并自动管理数据库模式——这称为migrate,我们稍后将讨论它——但是首先,让我们看看迁移将运行什么SQL。sqlmigrate命令获取迁移名称并返回它们的SQL:

$ python manage.py sqlmigrate polls 0001

运行结果:

BEGIN;
--
-- Create model Choice
--
CREATE TABLE `polls_choice` (`id` integer AUTO_INCREMENT NOT NULL PRIMARY KEY, `choice_text` varchar(200) NOT NULL, `votes` integer NOT NULL);
--
-- Create model Question
--
CREATE TABLE `polls_question` (`id` integer AUTO_INCREMENT NOT NULL PRIMARY KEY, `question_text` varchar(200) NOT NULL, `pub_date` datetime(6) NOT NULL);
--
-- Add field question to choice
--
ALTER TABLE `polls_choice` ADD COLUMN `question_id` integer NOT NULL;
ALTER TABLE `polls_choice` ADD CONSTRAINT `polls_choice_question_id_c5b4b260_fk_polls_question_id` FOREIGN KEY (`question_id`) REFERENCES `polls_question` (`id`);
COMMIT;
 

makemigrations模型迁移就是将python语句变为SQL,如果你懂数据库基础,我就不多说了。

请注意以下几点:

准确的输出将根据您使用的数据库而有所不同。上面的示例是为MySQL生成的。

自动添加主键(id)。(你也可以重写这个。)

按照约定,Django向外键字段名追加“_id”。(是的,您也可以覆盖它。)

外键关系由外键约束显式表示。不要担心可延迟的部分;这只是告诉MySQL在事务结束之前不要强制外键。

它是根据您使用的数据库定制的,因此数据库特定的字段类型,如auto_increment (MySQL)、serial (PostgreSQL)或integer primary key autoincrement (SQLite)将自动为您处理。字段名的引用也是如此——例如,使用双引号或单引号。

sqlmigrate命令实际上并不在数据库上运行迁移—它只是将迁移结果打印到屏幕上,这样您就可以看到SQL Django认为需要什么。它有助于检查Django将要做什么,或者如果您的数据库管理员需要SQL脚本进行更改,那么它也非常有用。

现在,再次运行migrate在数据库中创建这些模型表:

$ python manage.py migrate
Operations to perform:
  Apply all migrations: admin, auth, contenttypes, polls, sessions
Running migrations:
  Rendering model states... DONE
  Applying polls.0001_initial... OK

总的来说,就3步:

  • 创建你的模型(在polls/models.py)
  • 将模型类中的python语句迁移为你设置的数据库语言(python manage.py makemigrations polls)
  • 将SQL语句在数据库运行,完成创建表(python manage.py migrate)

No. 4 使用Django提供的免费API

对于这点,我最开始学认为是可以跳过的,后面有admin界面管理,简单得多。为什么要说呢,还是因为实际运用需要呀。

现在,让我们跳到交互式Python shell中,使用Django提供的免费API。要调用Python shell,使用以下命令:

$ python manage.py shell

我们使用这个而不是简单地输入“python”,因为是manage.py文件中设置DJANGO_SETTINGS_MODULE环境变量,它为Django提供了mPython导入mysite/settings.py文件。

进入shell研究数据库API:

>>> from polls.models import Choice, Question  # Import the model classes we just wrote.

# No questions are in the system yet.
>>> Question.objects.all()
<QuerySet []>

# Create a new Question.
# Support for time zones is enabled in the default settings file, so
# Django expects a datetime with tzinfo for pub_date. Use timezone.now()
# instead of datetime.datetime.now() and it will do the right thing.
>>> from django.utils import timezone
>>> q = Question(question_text="What's new?", pub_date=timezone.now())

# Save the object into the database. You have to call save() explicitly.
>>> q.save()

# Now it has an ID.
>>> q.id
1

# Access model field values via Python attributes.
>>> q.question_text
"What's new?"
>>> q.pub_date
datetime.datetime(2012, 2, 26, 13, 0, 0, 775217, tzinfo=<UTC>)

# Change values by changing the attributes, then calling save().
>>> q.question_text = "What's up?"
>>> q.save()

# objects.all() displays all the questions in the database.
>>> Question.objects.all()
<QuerySet [<Question: Question object (1)>]>

等一下,<Question: Question object(1)>不是这个对象的一个有用的表示。让我们通过编辑问题模型(在polls/models中)来解决这个问题。并在问题和选择中添加__str__()方法,之前写的省略:

from django.db import models

class Question(models.Model):
    # ...
    def __str__(self):
        return self.question_text

class Choice(models.Model):
    # ...
    def __str__(self):
        return self.choice_text

在您的模型中添加__str__()方法是非常重要的,这不仅是为了您在处理交互式提示时的方便,而且也是因为在Django的自动生成的管理中,对象的表示形式是被使用的。

注意,这些是正常的Python方法。你也可以自定义方法,这在后面会学到

No. 4 介绍Django后台管理

为您的员工或客户端生成用于添加、更改和删除内容的管理站点是一项乏味的工作,不需要太多创造力。
因此,Django完全自动地为模型创建管理接口。

管理员不打算供站点访问者使用。这是给网站管理员的。

首先,我们需要创建一个可以登录到管理站点的用户。运行以下命令:

$ python manage.py createsuperuser
  • 输入您想要的用户名并按Enter。

    Username: admin
  • 输入您想要的邮箱并按Enter。

       Email address: admin@example.com

  • 输入您想要的密码并按Enter。

    Password: **********
    Password (again): *********
    Superuser created successfully.

启动开发服务器:

$ python manage.py runserver

现在,打开Web浏览器,转到本地域的“/admin/”,例如http://127.0.0.1:8000/admin/。你应该看到管理员的登录屏幕:

登录后,就看到这样:

让投票应用程序在管理员中可修改

但我们的投票应用程序在哪里?它不会显示在admin索引页面上。

只需要做一件事,我们需要告诉管理员问题对象有一个管理界面。为此,打开poll s/admin.py文件,编辑成这样:

from django.contrib import admin

from .models import Question

admin.site.register(Question)

现在我们已经注册了问题,Django知道它应该显示在admin index页面上,刷新:

这个是polls/models.py中Question类的迁移,另外Choice类也一样

这里需要注意的是:

表单是由问题模型自动生成的。

不同的模型字段类型(DateTimeField、CharField)对应于相应的HTML输入小部件。

点击“今日”和“现在”快捷键更改“发布日期”。然后单击“保存并继续编辑”。然后点击右上角的“历史”。您将看到一个页面,其中列出了通过Django admin对该对象所做的所有更改,以及更改者的时间戳和用户名。

当您熟悉models API并熟悉管理站点时,请阅读Django 2.1.6.学习初级篇(3),了解如何向投票应用程序添加更多视图。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值