[模型]:设置Meta元数据
在上一节课程中我们创建了模型类, 创建了一个user,也创建了一个article。 但是它都是使用默认的形式, 比如说这里的数据库的名称,默认就是'应用_类名'。
很多时候呢,我们需要对它进行一些单独的配置, 你比如说这个名字呢,我想给它自己定一个名字, 而不是使用这里的app01_article这样的名字, 这时,我们就可以使用模型的 元数据来解决。
模型中设置Meta
Article中设置Meta, 代码如下:
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, 代码如下:
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的文件,代码如下:
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,主要功能是:
-
从django.db导入models
-
定义BaseModel继承自models.Model
-
创建时间created_at字段,在实例第一次保存时会自动写入当前时间,可编辑
-
更新时间updated_at字段,每次保存对象时自动写入当前时间,可编辑
-
在Meta内部类中设置abstract=True,表示这是一个抽象基类不会创建表
-
其他模型可以继承这个BaseModel,就拥有了created_at和updated_at字段,以及自动管理这两个时间字段的功能
总结:
这是一个抽象基类,通过继承可以给其他模型添加创建时间和更新时间字段,以及自动管理这两个时间的方法。
设置abstract=True表示其仅用于继承,不会单独创建数据库表。
BaseModel父类创建完成后,就可以让User和Article 这2个子类来继承它了。 Article 模型代码如下:
from utils.basemodels import BaseModel # 导入父类
class Article(BaseModel): # 修改继承父类
id = models.IntegerField(primary_key=True)
....
User模型代码如下:
from utils.basemodels import BaseModel # 导入父类
class User(BaseModel): # 修改继承父类
id = models.IntegerField(primary_key=True)
....
接下来我们再来生成这个迁移文件。命令如下:
python manage.py make migrations
这里由于我们添加了两个字段,一个是创建时间,一个是更改时间。它们是自动生成的, 执行时,它提示是否需要设置默认值 。我们需要选择1, 然后默认值time,按下回车键。
创建完迁移文件以后,接下来咱们执行迁移命令。 使用如下命令:
python manage.py migrate
再次查看数据库中的user和articel, 这里新增了两个字段 创建时间和更新时间。 那么我们再看一下,在整个表中并没有创建一个叫做base model的表。 这是因为我们在元数据这里设置了它是一个抽象的类。
class Meta:
abstract = True
所以它并不会创建这样的表。
小伙伴们我们下节再见。