美文网首页
1.3 设计一个 blog 数据模式

1.3 设计一个 blog 数据模式

作者: gznb | 来源:发表于2020-07-20 16:15 被阅读0次

    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
    
    

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

    • title: 这个字段是文章的标题,这个字段是 CharField,在SQL数据库中会被翻译为 VARCHAR
    • slug: 这个字段是为了使用 URLs 的,slug 是一个 仅仅包含 字母、数字、下划线或连接字符的短标签。你可以使用 slug 字段构建对你博客文章一个美丽的,搜索友好的链接。你添加一个 unique_for_date 参数 在这个字段,以方便在 文章 URLs 中 使用 publishslug. Django 将防止多个文章在一个给定的日期有相同的slug。
    • author: z这个字段定义了一个 many-to-one(多对一) 关系,意味着一个文章被一个作者编写,一个作者可以编写多篇文章。对于这个字段,Django 将使用相关模型的主键在数据库中创建一个外键。在这个例子中,你依赖于 Django 验证系统的 User 模型。这个 on_delete 参数在引用对象被删除的时候将采取特殊的行为,这种特殊操作是 SQL 级别的,而不是Django 级别的。使用 CASCADE,当被引用的 用户对象被删除时,在数据库中所有的有关系的博客文章也会被删除。你可以在这个链接 中查看所有的可能的可选项。你可以使用related_name 属性去通过 User 反向查找 Post,这将允许你很容易访问到关系对象,你将在后面学习到更多有关这些的知识。
    • body : 这是 文章的主体。这个字段是一个 text 字段,在SQL数据库中将被翻译成 TEXT 列。
    • publish: 这个时间表示文章被发布的时间,你可以使用 Django 的 timezone.now 方法作为默认值,这将以感知当前时区的格式返回当前日期时间,你可以为它感知当前时区的版本是Python 中标准的 datetime.now 方法。
    • created: 这个时间表示文章被创建的时间,当你在这里使用 auto_now_add时,一个对象被创建的时候,会自动保存这个时间。
    • updated: 这个时间表示文章最后被更新的时间,当你在这里使用 auto_now时,一个对象被更新时,会自动保存这个时间。
    • status: 这个字段表明文章的状态,你使用了一个choices参数,所以这个字段的值只可能是你给定的可选值。

    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 命令把你的模型和数据库保持同步。

    相关文章

      网友评论

          本文标题:1.3 设计一个 blog 数据模式

          本文链接:https://www.haomeiwen.com/subject/gcdykktx.html