Django 模型

未匹配的标注
本文档最新版为 1.8,旧版本可能放弃维护,推荐阅读最新版!

我们现在想要创建的是一个为我们的博客存储所有文章的东西。但是为了做到这件事,我们需要讲到一点有关 objects(对象)的事情。

Objects(对象)

在编程中有一个概念叫做 面向对象编程 。 它的思想在于,不是把事物写成无聊的程序指令序列,而是为事物建立模型,然后定义他们是怎样交互的。

那什么是对象呢?它是一个属性和操作的集合。它听起来很奇怪,但我们会给你一个例子。

如果我们想塑造一只猫的模型,我们会创建一个名为 Cat 的对象,它有一些属性,例如:coloragemood(如:good, bad, sleepy :wink: ),还有 owner(主人) (可以被设定为 Person 对象--或者假若是流浪猫,这个属性可以为空)。

然后这个 Cat 会有一些行为: purrscratch, 或者 feed (这样的话,我们会给这只猫一些 CatFoodCatFood 可以是单独的包含像taste的一些属性的 object

Cat
--------
color
age
mood
owner
purr()
scratch()
feed(cat_food)
CatFood
--------
taste

所以基本思想就是用代码编写属性(称为 对象属性)来描述真实的事物和动作 (称为 方法).

我们将如何为博客帖子建立模型呢?我们想要建立一个博客,对吗?

我们需要回答一个问题:什么是一篇博客文章?它应该含有什么样的属性?

好的,我们的博客文章肯定需要一些文本,包括内容与标题,对吗? 知道是谁写的会很好 — — 所以我们需要一位作者。 最后,我们想要知道什么时候该文章创建并发布。

Post
--------
title
text
author
created_date
published_date

一篇博客文章可以做什么样的事情?有一些方法 来发布文章会很好,对吗?

因此我们需要一个 publish(发布) 的方法。

既然我们已经知道我们想要实现的内容,让我们在 Django 里面开始为它建模!

Django model

知道什么是对象,我们可以为我们的博客文章创建一个 Django 模型。

Django 里的模型是一种特殊的对象 — — 它保存在 database(数据库) 中。一个数据库是数据的集合。 这是你存储有关用户、 博客文章等的信息的地方。 我们将使用 SQLite 数据库来存储我们的数据。 这是默认的 Django 数据库适配器 — — 对于我们现在的需求而言它是足够的。

你可以将数据库中的模型看作是电子表格中的列 (字段) 和行 (数据)。

创建应用程序

为了让一切保持整洁,我们将我们的项目内部创建单独的应用程序。 如果一开始就让每一件东西井然有序,那就太好了。 为了创建一个应用程序,我们需要在命令行中执行以下命令 (从 manage.py 文件所在的 djangogirls 目录):

(myvenv) ~/djangogirls$ python manage.py startapp blog
(myvenv) C:\Users\Name\djangogirls> python manage.py startapp blog

你会注意到一个新的 blog 目录被创建,它现在包含很多文件。我们项目的目录和文件现在看起来应该像这样:

djangogirls
├── blog
│   ├── admin.py
│   ├── apps.py
│   ├── __init__.py
│   ├── migrations
│   │   └── __init__.py
│   ├── models.py
│   ├── tests.py
│   └── views.py
├── db.sqlite3
├── manage.py
├── mysite
│   ├── __init__.py
│   ├── settings.py
│   ├── urls.py
│   └── wsgi.py
├── myvenv
│   └── ...
└── requirements.txt

创建应用程序后,我们还需要告诉 Django 应该使用它。 我们是在 mysite/settings.py 文件中这样做的 —— 在代码编辑器中打开。 我们需要找到 INSTALLED_APPS 并在它下面添加一行代码 'blog.apps.BlogConfig', 就在 ]上面 。 所以最终的代码应如下所示:

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

创建一个博客文章模型

我们在 blog/models.py 文件中,定义所有的 Models 对象 — — 我们将在其中定义我们的博客文章。

让我们在代码编辑器中打开 blog/models.py,从中删除一切并编写这样的代码:

from django.conf import settings
from django.db import models
from django.utils import timezone

class Post(models.Model):
    author = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
    title = models.CharField(max_length=200)
    text = models.TextField()
    created_date = models.DateTimeField(default=timezone.now)
    published_date = models.DateTimeField(blank=True, null=True)

    def publish(self):
        self.published_date = timezone.now()
        self.save()

    def __str__(self):
        return self.title

再次检查你在 str 的两端使用的两个下划线字符(_) 。这是 Python 编程里面的一种常用的约定写法,有时我们也叫这个做 "dunder"("double-underscore" 的缩写)。

这看起来太吓人了,对吧?不过不用担心,我们会解释这几行是什么意思!

所有以 from 或 import 开始的所有行,都是需要从其他文件中添加到这里的一些内容。 不必在每个文件复制和粘贴同样的内容,我们可以用 from...... import...... 来导入这些内容。

class Post(models.Model): - 这行是用来定义我们的模型 (这是一个 对象).

  • class 是一个特殊的关键字,表明我们在定义一个对象。

  • Post 是我们模型的一个名字。我们可以给它取不同的名字 (但是我们必须避免使用特殊字符或者空格符)。总是以首字母大写来作为类名。

  • models.Model 表明 Post 是一个 Django Model ,所以 Django 知道它应该被保存在数据库中。
    现在我们定义了我们曾经提及到的那些属性:titletextcreated_datepublished_date 和 author。 为此,我们需要为我们每个字段定义一个类型 (它是文本? 是数字? 是日期? 与另一个对象的关联,比如用户?)。

  • models.CharField – 这是如何定义一个有限字符的文本。

  • models.TextField – 这是没有长度限制的长文本。听起来用在博客文章的内容上很理想,对吧?

  • models.DateTimeField – 这是日期和时间。

  • models.ForeignKey – 这是指向另一个模型的连接。

我们不会解释这里所有的代码,因为那会花太多时间了。 如果你想了解更多有关模型字段以及如何定义除上面描述以外的东西,那你应该去看看 Django 的官方文档 (docs.djangoproject.com/en/2.2/ref/...)。

def publish(self): 怎样呢?这正是我们之前提及到的 publish 方法。 def 表明这是一个函数或者方法,publish 是这个方法的名字。 如果你想的话你可以改变方法名。 命名的规则是使用小写字母以及下划线而非空白符。 举个例子,一个计算平均价格的方法可以叫做 calculate_average_price.

方法通常会 return 一些东西。 例如 __str__ 方法中就是一个例子。 在这种情况下,当我们调用 __str__() 我们将得到文章标题的文本 (字符串)。

同时需要注意到 def publish(self): 和 def __str__(self): 在类内的定义都是缩进的。因为 Python 是对空格敏感的,在类内我们需要缩进我们的方法定义。否则,方法将不属于类,你会得到一些程序的意外的行为。

如果关于模型尚有不清楚的,请随时问你的教练 ! 我们知道它很复杂,特别是当你同时学习对象和函数的时候。 但希望它现在在你看来没有那么神奇!

在数据库中为模型创建数据表

在这里的最后一步是将我们新的模型添加到我们的数据库。 首先我们必须让 Django 知道我们在我们的模型 (我们刚刚创建的!) 有一些变更。 输入 python manage.py makemigrations blog 。 它看起来会像这样:

(myvenv) ~/djangogirls$ python manage.py makemigrations blog
Migrations for 'blog':
  blog/migrations/0001_initial.py:
  - Create model Post

注意: 记得保存你编辑的文件。否则,你的电脑会执行之前的版本的文件,并给你意外的错误信息。

Django 为我们准备了我们必须应用到我们数据库的迁移文件。输入 python manage.py migrate blog,然后对应的输出应该是:

(myvenv) ~/djangogirls$ python manage.py migrate blog
Operations to perform:
  Apply all migrations: blog
Running migrations:
  Applying blog.0001_initial... OK

万岁!我们的 Post 模型现在已经在我们的数据库里面了!它看起来很不错,对吧?跳转到下一个章节,看看你博客文章的样子!

本文章首发在 LearnKu.com 网站上。

本译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。

原文地址:https://learnku.com/docs/django-girls/2....

译文地址:https://learnku.com/docs/django-girls/2....

上一篇 下一篇
Summer
贡献者:2
讨论数量: 0
发起讨论 查看所有版本


暂无话题~