1.3 设计一个 blog 数据模式

2020-07-20  本文已影响0人  gznb

1. 设计一个 blog 数据模式

你将通过定义数据模型为你的 blog 设计数据模式。 一个模型就是一个 django.db.models.Model 的 Python 子类,它的每个属性代表着数据库的一个字段。Django 将为每一个在models.py文件中定义的模型创建一个表。当你创建一个模型时,Django 实际上提供给你一个可以在数据库中轻易查询对象的API。

首先你需要顶一个 Post 模型,把下面这些行的代码放到 blog 应用程序的 models.py 文件中:

from django.db import models
from django.utils import timezone
from django.contrib.auth.models import User


class Post(models.Model):
    STATUS_CHOICES = (
        ('draft', 'Draft'),
        ('published', 'Published')
    )

    title = models.CharField(max_length=250)  
    slug = models.SlugField(max_length=250,   
                            unique_for_date='publish')
    author = models.ForeignKey(User,
                               on_delete=models.CASCADE,
                               related_name='blog_posts')   
    body = models.TextField()  
    publish = models.DateTimeField(default=timezone.now) 
    created = models.DateTimeField(auto_now_add=True)     
    updated = models.DateTimeField(auto_now=True)         
    status = models.CharField(max_length=10,
                              choices=STATUS_CHOICES,
                              default='draft')          

    class Meta:
        ordering = ('-publish', )   

    def __str__(self):
        return self.title

这是你的博客文章的数据模型,让我们看看在模型中定义的这些字段:

Django 还附带了许多不同类型的字段,你可以在你们模型中定义他们。你可以在这个链接中发现更多的字段类型信息。

模型中的Meta 类包含元数据,您告诉Django在查询数据库时,默认情况下按publish字段降序对结果进行排序,你可以通过使用 负号前缀指定为降序,这样最近发布的文章将会最先出现。

这个 __str__() 方法默认把一个对象以人类可读的方式进行展示,django在很多地方都使用到了它,例如在 管理员站点中。

如果你以前使用的Python2.X,现在在Python3.X 中所有的 strings 本质上都是 Unicode , 因此我们仅仅使用 __str__() 方法,并且 __unicode__()方法已经过时了。

2. 激活应用程序

为了能够让 Django 去保持追踪你的应用程序并且根据它的模型创建数据库的表,你不得不去激活它。为了做到这一点,你需要编辑 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',
]

这个 BlogConfig 类是应用程序的配置,现在 Django 知道了应该要在这个项目中激活你的应用程序并且将能够加载它的模型。

3. 创建和应用迁移

现在你有了一个 blog 文章的数据模型,那么还需要一个用于它的数据库表。Django 自带了一个迁移系统,它用于记录对模型的改变,并允许他们传播到数据库中。正如前面提到的,migrate 命令将对所有在 INSTALLED_APPS中的应用程序执行迁移。它使数据库与当前的模型和现有迁移同步。

首先你需要为你的 Post 模型创建一个初始化 迁移。在项目根目录下,运行下面的命令:

python manage.py makemigrations blog

你应该得到下面的输出:


Snipaste_2020-07-16_11-09-26.jpg

Django 将在 blog 应用程序的 migrations 目录中创建一个 0001_initial.py 文件。你可以打开这个文件看看迁移是如何出现的。迁移指定了对数据库中执行的其他迁移和操作的依赖关系,以便与模型更改同步。

让我们来看看 Django根据你的模型在数据库中创建表所要执行的 SQL代码。这个 sqlmigrate 命令接收 迁移的名称,返回它的SQL而不执行它。 运行以下命令去检查第一次迁移的SQL输出:

python manage.py sqlmigrate blog 0001

应该可以看到下面的输出:


Snipaste_2020-07-16_11-36-12.jpg

确切的输出应该依赖于你所使用的数据库。前面的输出是使用的 SQLite, 你可以看看这些输出,Django 通过结合应用程序名称和模型名称以小写的方式生成了这个表的名字(blog_post), 但是您也可以使用db_table属性在模型的Meta类中为您的模型指定一个自定义数据库名称。

Django 自动为每一个模型创建一个主键,但是你也可以通过在模型字段指定 primary_key=True来重写它。 这个默认的主键 id 列,它是一个自增的整数。 此列自动添加到模型中的 id 字段。

让我们把一个新的模型同步到数据库中,运行下面的命令去执行已存在的迁移:

python manage.py migrate

你将最后得到下面这行的输出:


Snipaste_2020-07-16_13-37-13.jpg

你刚刚为 INSTALLED_APPS 中的所有应用程序完成了迁移,其中包括你的 blog 应用程序。在应用迁移以后,数据库将反应模型的当前状态。

如果你编辑 models.py 文件,通过对模型 添加、移除、改变现有字段,或者是添加了一个新的模型,你就需要使用 makemigrations 命令去创建一个新的迁移。迁移将运行Django跟踪模型的改变。 然后使用 migrate 命令把你的模型和数据库保持同步。

上一篇下一篇

猜你喜欢

热点阅读