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 中,我们只需要在一个地方定义数据模型,然后自动生成各种派生物。

基于上面的图,使用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”的设置。
总结
我們這次進行了關於數據庫及其管理的設定。第三個也將很快加入。