Django入门教程

前言

第一章: django快速入门

第二章: django MTV架构

第三章: django视图

第四章: django模板

第五章: django模型

第六章: django后台管理系统

第七章: 项目实战-简易的博客系统

第八章:django表单

第九章:django用户认证系统

第十章:django中的会话

第十一章:django安全

第十二章:django性能优化

第十三章:django实用工具

首页 > Django入门教程 > 第五章: django模型 > 5.6节: 模型的meta类

5.6节: 模型的meta类

薯条老师 2020-08-07 07:15:46 234876 0

编辑 收藏

广州番禺Python, Java小班周末班培训

薯条老师在广州做Python和Java的小班培训,一个班最多10人,学员的平均就业薪资有11K不在广州的同学可以报名线上直播班,跟线下小班的同学们同步学习。培训的课程有Python爬虫,Python后端开发,Python办公自动化,Python大数据分析,Python量化投资,Python机器学习,Java中高级后端开发。授课详情请点击:http://chipscoco.com/?cate=6

5.6.1 模型中的关系字段

将模型与数据库进行映射时,django会按既定的规则创建数据表的表名,为字段创建索引,规定数据的排序方式等,这里的表名,索引等就是模型的元数据。在定义模型时,可以在其内部定义一个Meta类,以覆盖默认的元数据选项。

5.6.2 定义Meta类

在模型中定义一个Meta类的语法形式:

class ModelName(models.Model):
    class Meta:
        pass

覆盖默认的元数据选项,需要在Meta类中以类属性赋值的方式来覆盖Meta选项的值。例如覆盖默认的表名格式,可以通过db_table属性来进行设置。

代码实例:

class Blog(models.Model):
    class Meta:
        # 以类属性赋值的方式来覆盖Meta选项的值
        db_table = 'blog'

在上文代码中,将模型Blog对应的数据表的表名修改为blog, 如未覆盖db_table选项,django会按以下的格式为数据表进行命名:

appname_modelname

appname表示django应用的名称,modelname表示模型的类型名,二者皆为小写形式。例如django应用名称为blog,模型的类型名为Blog,则数据表名为:blog_blog。

常用的Meta选项:

(1) abstract

abstract属性用来设置该模型是否为抽象基类,将其设置为True时,当前的模型类即为一个抽象基类。在python等面向对象语言中,抽象基类不能进行实例化,只能作为其它模型类的父类。

(2) app_label

app_label属性用来设置当前的模型属于哪一个Django应用。如果定义该模型的Django应用未在INSTALLED_APPS中进行注册时,必须通过app_label属性来进行设置。

代码实例:

class Blog(models.Model):
    class Meta:
        # 以类属性赋值的方式来覆盖Meta选项的值
        app_label = 'another_chips'

在上文代码中,通过app_label属性来设置模型归属的django应用:Blog模型属于django应用another_chips。

(3) db_table

db_table属性用来定义数据表的表名。

(4) ordering

ordering用来定义数据的排序方式。对从模型中获取的数据进行排序有两种方法:一种是通过QuerySet API,另一种则是通过元数据选项ordering来定义数据排序。使用ordering定义数据排序的语法形式:

ordering = ['-field_name','?field_name','field_name']

field_name表示模型的字段名,字段名前面的-号表示使用降序排序,?表示使用随机排序,无任何前缀符号时表示按升序进行排序。

代码实例:

class Blog(models.Model):
    modify_time = models.DateTimeField(auto_now = True,verbose_name="修改时间") 
    class Meta:
        # 以类属性赋值的方式来覆盖Meta选项的值
        db_table = 'blog'
        app_label = 'another_chips'
        ordering = ['-modify_time']

在上文的代码中,对模型获取数据时,会返回根据modify_time进行降序排序后的结果。

(5) indexes

indexes属性用来给模型中的字段创建索引。

语法形式:

indexes = [models.Index(fields=['field_name','field_name'], name='index_name'),]

field_name表示字段名,index_name表示索引名,在fields参数中添加需创建索引的字段名。

代码实例:

class Blog(models.Model):
    author = models.DateTimeField(max_length = 20)
    modify_time = models.DateTimeField(auto_now = True,verbose_name="修改时间") 
    class Meta:
        # 以类属性赋值的方式来覆盖Meta选项的值
        indexes = [
                    models.Index(fields=['author'], name='IDX_AUTHOR'),
                    models.Index(fields=['modify_time'], name='IDX_MODIFY_TIME'),
        ]

在上文代码中,分别对字段author以及modify_time创建了索引。

(6) verbose_name

verbose_name同模型字段的可选参数verbose_name,用来定义一个可读的名称。在Meta类中通过verbose_name来为模型定义可读的名称。

代码实例:

class Blog(models.Model):
    class Meta:
        # 以类属性赋值的方式来覆盖Meta选项的值
        verbose_name = '博客'

(7) constraints

通过constraints属性来为模型字段创建约束,例如字段值约束,唯一约束。对字段值进行约束,使用models中的CheckConstraint类,语法形式:

constraints = [models.CheckConstraint(check=models.Q(query), name=''),]

使用models中的Q对象来构造约束条件,约束条件的使用语法:

field__operator = value

field表示模型字段名,operator表示Q对象中的运算符,Q对象中的比较运算符:

gt   大于

gte  大于等于

lt   小于

lte  小于等于

使用CheckConstraint类来进行字段约束的代码实例:

class Girl(models.Model):
    age = models.IntegerField()
    class Meta:
        # 以类属性赋值的方式来覆盖Meta选项的值
        constraints = [ models.CheckConstraint(check=models.Q(age__gte=10), name='age__gte_18'),]

在上述代码中,对模型字段age的值进行了约束, django会确保数据库中的age值恒大于等于10。关于Q对象会在5.6节QuerySet API中进行介绍。对模型字段进行唯一约束,使用models中的UniqueConstraint类型。

UniqueConstraint类的构造形式:

UniqueConstraint(fields=['field', 'field'], name='')

参数fields用来添加需要进行唯一性约束的模型字段,添加多个字段时,表示多个字段的组合也必须是唯一的,name用来定义约束名。使用UniqueConstraint类来进行唯一约束的代码实例:

class User(models.Model):
    name = models.CharField(max_length = 20)
    class Meta:
        # 以类属性赋值的方式来覆盖Meta选项的值
        constraints = [ models.UniqueConstraint(fields=['name'], name='UNIQUE_NAME'),]

在上述代码中,将模型中的name字段进行唯一性约束。

5.6.3 最具实力的小班培训

薯条老师在广州做Python和Java的小班培训,一个班最多10人。不在广州的同学可以报名线上直播班,跟线下小班的同学们同步学习。打算参加小班培训的同学,必须遵守薯条老师的学习安排,认真做作业和项目。把知识学好,学扎实,那么找到一份高薪的工作就是很简单的一件事。

(1) Python后端工程师高薪就业班,月薪11K-18K,免费领取课程大纲
(2) Python爬虫工程师高薪就业班,年薪十五万,包拿Offer
(3) 数据分析高薪就业班,月薪11K-15K, 免费领取课程大纲
(4)
Python大数据挖掘,量化投资就业班,月薪12K-25K,免费领取课程大纲

扫码免费领取Python学习资料:


欢迎 发表评论: