Django教程备忘录第二部分

首先

这篇文章是关于第一次创建 Django 应用程序的备忘录,这是第二部分。
第一部分在这里→ Django 教程备忘录①。

数据库的配置

可以从mysite/setting.py文件中进行数据库的设置操作。

默认情况下,SQLite被用于使用,但在生产环境中,建议使用可扩展的数据库,如PostgreSQL。

本次教程中我们会使用SQLite,因此不需要进行任何更改。
在这里我们会设置TIME_ZONE为您自己所在的时区。默认为世界标准时间,如果您在日本,则设置为Asia/Tokyo。

关于INSTALLED_APPS

在setting.py文件中的INSTALLED_APPS下,默认包含以下应用程序。

    • django.contrib.admin・・・管理(admin)サイト

 

    • django.contrib.auth・・・認証システム

 

    • django.contrib.contenttypes・・・コンテンツタイプフレームワーク

 

    • django.contrib.sessions・・・セッションフレームワーク

 

    • django.contrib.messages・・・メッセージフレームワーク

 

    django.contrib.staticfiles・・・静的ファイルの管理フレームワーク

如果要使用其他数据库,

稍后我会写。

创建数据库

创建桌子

首先,您需要创建一个表。请执行以下命令。

$ python manage.py migrate

迁移命令会根据INSTALL_APPS的配置信息,在mysite/setting.py文件的数据库设置中,按需创建所有数据库的表格。

创建模型

Django 遵循 DRY 原则。DRY 意味着不重复相同的事情,而在 Django 中,冗余是有害的,规范化才是好的。因此,在 Django 中,我们只需要在一个地方定义数据模型,然后自动生成各种派生物。

Django-ER.png

基于上面的图,使用Python代码表示如下。

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)

每个变量名都是机器可读的字段名,并且它们也被用作数据库列的名称。此外,还可以在Field的第一个参数中指定人类可读的字段名作为可选项。在上述代码中,我们为pub_date的Field设置了一个人类可读的字段名。

在Choice模型的question字段内,models.ForeignKey()的on_delete=models.CASCADE参数表示当参考的外部键对应的原始数据被删除时,也会删除此数据。

启用模型

为了让之前写的模型在项目中被识别,需要告诉项目安装了polls应用程序。

要将应用程序包含到项目中,需要将对应的配置类的引用添加到INSTALL_APPS中。添加的内容如下所示。

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

完成此设置后,将创建此更改的迁移。

$ python manage.py makemigrations polls

通过运行makemigrations命令,可以向Django传达模型发生了变化,并将这些变化保存为迁移文件的形式。

然后,使用以下命令在数据库中创建模型的表格。

$ python manage.py migrate

我已经在数据库上成功创建了一个表格。

尝试玩一下API

为了使用Django提供的API,我们需要启动Python终端。

$ python manage.py shell

当启动Shell后,我会逐渐尝试数据库API。

>>> from polls.models import Choice, Question

>>>Question.objects.all()
<QuerySet[]>

>>>from django.utils import timezone
>>>q= Question(question_text="What's new?",pub_date=timezone.now())

>>>q.save()

>>>q.id

>>>q.question_text
"Whats new?"
>>>q.pub_date
datetime.datetime(2012, 2, 26, 13, 0, 0, 775217, tzinfo=<UTC>)

>>>q.question_text = "what's up?"
>>>q.save()

>>>Question.objects.all()
<QuerySet [<Question: Question object (1)>]>

最後一行的结果上显示着,如此保持下去我就不知道里面存储了什么。
为了修正此问题,我会在Question和Choice两个地方都加上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

这个功能的添加对于管理员来说也很重要,因为它可以提高管理的便利性。

我們將在模型類中添加一個類方法。

import datetime #←NEW!!

from django.db import models   
from django.utils import timezone #←NEW!!


class Question(models.Model):
    # ...
    def was_published_recently(self):
        return self.pub_date >= timezone.now() - datetime.timedelta(days=1)

上述的was_published_recently()是一个用于判断数据是否在一天内更新的函数。

现在,请保存更改并重新启动PythonShell。

>>>from polls.models import Choice,Question

>>>Question.objects.all() #文字列として表示されるようになっているか確認
#<QuerySet [<Question: What's up?>]>

>>> Question.objects.filter(id=1) 
#<QuerySet [<Question: What's up?>]>
>>> Question.objects.filter(question_text__startswith='What')
#<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(pk=1) #プライマリキーが1のものを検索
#<Question: What's up?>

>>>q.was_published_recently() #1日以内に投稿されたものか確認
True

>>> q = Question.objects.get(pk=1)

>>>q.choice_set.all()

>>>q.choice_set.create(choice_text="Not much", votes=0)
>>>q.choice_set.create(choice_text="The sky", votes=0)
>>> c=q.choice_set.create(choice_text="Just hacking again", votes=0)

>>>c.question
#<Question: What's up?>

>>>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.delete()

“Django管理后台”

Django Admin自动化生成管理网站以进行页面更改和删除的功能。

创建管理员用户

首先,您需要创建一个用于访问管理员网站的用户。为此,请执行下面的命令。

$ python manage.py createsuperuser

在某些情况下,可能会出现以下错误。

Superuser creation skipped due to not running in a TTY. You can run manage.py createsuperuser in your project to create one manually. 

请执行以下命令。

$ winpty python manage.py createsuperuser

请进行以下步骤:
1. 进入输入等待状态
2. 输入您喜欢的用户名
3. 设置电子邮件
4. 设置密码

Username: (username)

Email address: hogehoge@example.com

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

启动开发服务器

Django的管理员网站默认已启用,只需启动开发服务器即可访问。

$ python manage.py runserver

下一步要访问 http://127.0.0.1:8000/admin/。
然后,应该会显示管理员登录页面。

进入管理员网站后,会显示“群组”和“用户”,但没有“投票”应用的管理界面。

要使管理员能够在后台上进行编辑,需要编辑polls/admin.py文件。

from django.contrib import admin

from .models import Question

admin.site.register(Question)

进行以上设置将在admin网站上显示”Questions”的设置。

总结

我們這次進行了關於數據庫及其管理的設定。第三個也將很快加入。

广告
将在 10 秒后关闭
bannerAds