Skip to main content

[模型]:设置Meta元数据

在上一节课程中我们创建了模型类, 创建了一个user,也创建了一个article。 但是它都是使用默认的形式, 比如说这里的数据库的名称,默认就是'应用_类名'。

很多时候呢,我们需要对它进行一些单独的配置, 你比如说这个名字呢,我想给它自己定一个名字, 而不是使用这里的app01_article这样的名字, 这时,我们就可以使用模型的元数据来解决。

模型中设置Meta

Article中设置Meta, 代码如下:

demo/app01/models.py

class Article(Model):
id = models.IntegerField(primary_key=True)
title = models.CharField(max_length=120)
slug = models.CharField(max_length=200, default='')
content = models.TextField()
publish_date = models.DateTimeField()
user = models.ForeignKey(User, on_delete=models.CASCADE)

class Meta:
db_table = 'article'
verbose_name = '文章信息'
verbose_name_plural = '文章信息'
ordering = ['-publish_date']
代码解析

在Meta内部类中可以配置一些模型的元信息:

  • db_table: 在数据库中的表名,如果不设置将使用app名_模型类名的格式。
  • verbose_name、verbose_name_plural: 模型的单数和复数名称,用于显示在Admin站点等。
  • ordering: 对查询结果排序的默认字段,负号表示降序。

User中设置Meta, 代码如下:

demo/account/models.py
class User(Model):
id = models.AutoField(primary_key=True)
username = models.CharField('用户名', max_length=30,null=True,blank=True,unique=True)
password = models.CharField('密码',max_length=30)
email = models.EmailField('邮箱', null=True,blank=True, unique=True)

class Meta:
db_table = 'user'
verbose_name = '用户信息'
verbose_name_plural = '用户信息'

执行数据迁移操作:

python manage.py makemigrations

python manage.py migrate

此时,查看数据库中的2张表,已经变成article和user了。

设置共用类

那除此之外呢,元数据还有一些其它的应用。比如说 当前的User表和Article表都有一些公用的字段。 例如创建时间、修改时间,这些字段每个表都可以用, 所以我们可以创建一个公用的类,就叫做BaseModel。 然后让它来继承这里的Django中的Model。

在demo根目录下,创建一个utils文件夹,在它下创建一个叫做basemodels.py的文件,代码如下:

demo/utils/basemodels.py
from django.db import models

class BaseModel(models.Model):
created_at = models.DateTimeField('创建时间', auto_now_add=True, editable=True)
updated_at = models.DateTimeField('更新时间', auto_now=True, editable=True)

class Meta:
abstract = True
代码解析

这段代码定义了一个抽象基类BaseModel,主要功能是:

  1. 从django.db导入models

  2. 定义BaseModel继承自models.Model

  3. 创建时间created_at字段,在实例第一次保存时会自动写入当前时间,可编辑

  4. 更新时间updated_at字段,每次保存对象时自动写入当前时间,可编辑

  5. 在Meta内部类中设置abstract=True,表示这是一个抽象基类不会创建表

  6. 其他模型可以继承这个BaseModel,就拥有了created_at和updated_at字段,以及自动管理这两个时间字段的功能

总结:

这是一个抽象基类,通过继承可以给其他模型添加创建时间和更新时间字段,以及自动管理这两个时间的方法。

设置abstract=True表示其仅用于继承,不会单独创建数据库表。

BaseModel父类创建完成后,就可以让User和Article 这2个子类来继承它了。 Article 模型代码如下:

demo/app01/models.py

from utils.basemodels import BaseModel # 导入父类

class Article(BaseModel): # 修改继承父类
id = models.IntegerField(primary_key=True)
....

User模型代码如下:

demo/account/models.py

from utils.basemodels import BaseModel # 导入父类

class User(BaseModel): # 修改继承父类
id = models.IntegerField(primary_key=True)
....

接下来我们再来生成这个迁移文件。命令如下:

python manage.py make migrations
warning

这里由于我们添加了两个字段,一个是创建时间,一个是更改时间。它们是自动生成的, 执行时,它提示是否需要设置默认值。我们需要选择1, 然后默认值time,按下回车键。

创建完迁移文件以后,接下来咱们执行迁移命令。 使用如下命令:

python manage.py migrate 

再次查看数据库中的user和articel, 这里新增了两个字段 创建时间和更新时间。 那么我们再看一下,在整个表中并没有创建一个叫做base model的表。 这是因为我们在元数据这里设置了它是一个抽象的类。

demo/utils/basemodels.py
    class Meta:
abstract = True

所以它并不会创建这样的表。

小伙伴们我们下节再见。