编写第一个Django应用:配置部分

配置数据库

打开mysite/settings.py,默认情况下,Django项目使用的数据库是SQLite.SQLite包含在Python中,所以你不需要另外的安装其他任何东西来支持你的数据库.然而,当你要使用其他的数据库的时候,你可能需要其他的设置.

默认配置

使用mysql的配置

注意,另外还要手动常见数据库polls,并且还要在mysite/目录下的init.py中添加以下代码,让mysqldb代替原来的sqlitedb

  • 设置语言和时间
  • 注意顶端的INSTALL_APPS默认包含下面的应用,它们是Django与生居来的

生成数据库表

python manage.py makemigrations
python mange.py migrate

makemigrations 会将数据库的更改的记录到一个小本本上,而migrate命令,会将查看INSTALL_APPS设置并根据mysite/settings.py中的数据库设置创建必要的数据库表.

对于极简主义来说,我们如果不需要其中的某一个应用或所有应用,可以在运行migrate之前从INSTALLED APPS中自由的注释或删除响应的行.migrate只会将INSTALL_APPS中的应用运行到数据库的迁移

创建模型

  • 理念

模型指出了数据的唯一,明确的真实来源.它包含了正在存储的数据的基本字段和行为.Django遵循DRY原则(Do not Repeat Yourself)原则.这个原则的目标是从一个地方定义你的数据模型,并自动从它获取得到你需要的信息.

在这个简单的投票应用中,我们将创建两个模型: Question和Choice。 Question对象具有一个question_text(问题)属性和一个publish_date(发布时间)属性。 Choice有两个字段:选择的内容和选择的得票统计。 每个Choice与一个Question关联。

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可以完成以下两个功能:

  • 为该应用创建数据库表(CREATE TABLE 语句)

  • 为Question对象和Choice对象创建一个访问数据库的API

  • 理念
    Django的应用是可以"在多个项目中使用同一个应用,也可以分发这些应用,因为不需要与某个特定的Django安装绑定."
    要向使用我们的应用,则必须在setting.py中的INSTALL_APPS中注册安装我们的应用.

INSTALL_APPS = [
      'polls',
]

然后我们运行命令migrations命令,针对某个app的

python mange.py makemigrations polls

你应该看到如下的内容:

通过makemigrations告诉Django,已经对模型做了一些更改,并且会将这些更改记录为迁移文件.
使用migrate命令可以运行这些迁移文件并自动管理你的数据库模式.

[migrate]命令会找出所有还没有被应用的迁移文件(Django使用数据库中一个叫做django_migrations的特殊表来追踪哪些迁移文件已经被应用过),并且在你的数据库上运行它们 —— 本质上来讲,就是使你的数据库模式和你改动后的模型进行同步。

实现模型变更的三个步骤:

玩转API

  • 下面我们进入Python的交互式的shell,玩转这些Django提供给你API.

一旦你进入shell,请浏览database API:

>>> from polls.models import Question, Choice   # Import the model classes we just wrote.(导入我们刚刚编写的那些模型类)

# No questions are in the system yet.(系统中还没有question。)
>>> Question.objects.all()


# Create a new Question.(创建一个新的Question。)
# 默认的settings文件中启用对时区的支持,所以
# Django要求pub_date为一个带有tzinfo的datetime。 使用timezone.now()
# 而不是datetime.datetime.now(),它将完成正确的事情。
>>> from django.utils import timezone
>>> q = Question(question_text="What's new?", pub_date=timezone.now())

# 保存这个对象到数据库中。 你必须显示地调用save()。
>>> q.save()

# 现在它有一个ID。 注意,它可能为"1L"而不是"1",取决于
# 你使用的数据库。 这不是什么事;它只是表示你的
# 数据库后端返回的是Python长整形
# 对象。
>>> q.id
1

# 通过Python属性访问模型字段的值。
>>> q.question_text
"What's new?"
>>> q.pub_date
datetime.datetime(2012, 2, 26, 13, 0, 0, 775217, tzinfo=)

# 通过改变属性来改变字段的值,然后调用save()。
>>> q.question_text = "What's up?"
>>> q.save()

# objects.all()显示数据库中所有的question。
>>> Question.objects.all()
]>

先等一下。 完全是这个对象无意义的表示。 让我们来修复这个问题,编辑Question模型(在polls/models.py文件中)并添加一个[__str__()]方法给QuestionChoice

polls/models.py

from django.db import models
from django.utils.encoding import python_2_unicode_compatible

@python_2_unicode_compatible  # 如果你需要支持Python 2
class Question(models.Model):
    # ...
    def __str__(self):
        return self.question_text

@python_2_unicode_compatible  # 如果你需要支持Python 2
class Choice(models.Model):
    # ...
    def __str__(self):
        return self.choice_text

创建自定义的方法

下面看下其他的一些数据库的操作方法

>>> from polls.models import Question, Choice

# 确认我们的 __str__()方法 正常工作.
>>> Question.objects.all()
]>

# Django 提供了丰富的数据库查询 API 通过
# 关键字参数来驱动
>>> Question.objects.filter(id=1)
]>
>>> Question.objects.filter(question_text__startswith='What')
]>

# 获取今年发布的问题
>>> from django.utils import timezone
>>> current_year = timezone.now().year
>>> Question.objects.get(pub_date__year=current_year)


# 请求ID不存在,这将会引发一个异常.
>>> Question.objects.get(id=2)
Traceback (most recent call last):
    ...
DoesNotExist: Question matching query does not exist.

# 通过主键查询数据是常见的情况,因此 Django 提供了精确查找主键的快捷方式。
# (与上句合并)
# 以下内容与 Question.objects.get(id = 1)相同。
>>> Question.objects.get(pk=1)


# 确认我们的自定义方法正常工作.
>>> q = Question.objects.get(pk=1)
>>> q.was_published_recently()
True

# 给 Question 创建几个 Choices. 创建一个新的
# Choice 对象, 使用 INSERT 语句将选项添加到可用选项的集合并返回新的“Choice”对象。
# (合并至上句) Django 创建
# 一个集合来控制通过外键关联的“另一端”。
# (例如,一个“问题”的“选项”)
>>> q = Question.objects.get(pk=1)

# 显示任何有关的选项 ——目前还没有.
>>> q.choice_set.all()


# 创建三个choices。
>>> 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)

# Choice 对象通过 API 访问与之关联的 Question 对象.
>>> c.question


# 反之亦然:Question对象可以访问Choice对象。
>>> q.choice_set.all()
, , ]>
>>> q.choice_set.count()
3

# AIP 根据需要自动创建关系。
# 可以使用双下划线分隔关系。
# 它的工作机制是尽可能深的创建关系,而没有限制。
# 通过 pub_date 查找今年内创建的问题的所有选项
# (再次使用了之前创建的 'current_year' 变量).
>>> Choice.objects.filter(question__pub_date__year=current_year)
, , ]>

# 让我删除一个选项. 使用 delete() 方法.
>>> c = q.choice_set.filter(choice_text__startswith='Just hacking')
>>> c.delete()

Django管理后台简介

创建一个管理员用户

python manage.py createsuperuser

然后运行网站,访问http://127.0.0.1:8000/admin/

进入管理员后台站点,用你注册的用户名和密码登录
你将看到几类可编辑的内容:groups和users。 它们是由django.contrib.auth提供的,这个认证框架集成在Django中。

  • 让投票应用在后台管理站点中可编辑
    需要在polls/admin.py中注册Question对象
from django.contrib import admin

from .models import Question

admin.site.register(Question)

然后对应的截图是这样的

探索后台管理的功能

点击“Questions”。 现在,你会进入Question的“变更列表”。 这个界面显示了数据库中的所有question,你可以选择一个来更改它。 我们之前创建的“What is this?”问题

可以点击它进行编辑.

你可能感兴趣的:(编写第一个Django应用:配置部分)