头图

Django笔记八之model中Meta参数的使用

本文首发于微信公众号:Hunter后端

原文链接:Django笔记八之model中Meta参数的使用

前面介绍了 model 的字段属性,字段类型,这篇笔记介绍一下 model 的 Meta 选项。

这个选项提供了一些参数,比如排序(ordering),表名(db_table)等。

但这都不是必需的,都是作为可选项,主要是为使用者提供方便的、自定义的一些用法。

以下是本次笔记的目录列表:

  1. db_table
  2. get_latest_by
  3. managed
  4. ordering

1、db_table

一般如果我们创建 model 的时候不指定表名,系统在 makemigration 和 migrate 的时候会默认给我们添加表名。

规则是:app_name + "_" + model_name 的小写。

比如一个 model 为 TestTableName,放在 blog 这个 application 下,那么在迁移的时候,数据库表名则是:blog_testtablename。

注意: 上述情况使用的数据库是 oracle,且表名过长,则会因为 oracle 有一个表名长度的限制,会截取表名的长度。

而如果我们在 Meta 里使用 db_table 参数,则可以直接指定表名,且无视 application 名称前缀的规定。

以下是使用示例:

class TestModel(models.Model):
    pass

    class Meta:
        db_table = 'test_table'

那么在执行 migration 的时候,系统会为这个 model 创建表名为 test_table 的表。

以上也是 Meta 使用的方式。

2、get_latest_by

指定 latest() 函数默认使用的字段。

先来介绍一下 latest() 函数,这个函数的使用方法后面会介绍,有一种用法:TestModel.objects.latest('field_name'),这样通过指定字段名称,系统会返回 TestModel 按照字段名为 field_name 排序的最新的一条数据。

而如果我们在 Meta 里指定了这个参数,那么我们就就可以在使用上述方法的时候不用指定字段名,按照我们在 Meta 里指定的字段名来排序返回最新的一条,比如在 Blog model里我们这样指定:

class Blog(models.Model):
    name = models.CharField(max_length=100)
    tagline = models.TextField()


    class Meta:
        get_latest_by = "name"

那么当我们使用

Blog.objects.latest()

系统就会获取按照 name 字段来排序,取最后一条数据,这个就等价于:

Blog.objects.order_by('name').last()

如果在 Meta 中不指定 get_latest_by 参数,那么就会按照 id 返回最后一条数据。

注意: 表里需要有数据,否则会报错。

3、managed

该参数不设置的时候,默认为 True。

如果为 True,那么对这个 model 的每次更改,都会在 makemigrations 的时候被检测到。

这个字段如果为 False,表示 Django 在 makemigrations 的时候会忽略检测这张表,常用在仅用于系统查询的表。

用法如下:

class Blog(models.Model):
    pass

    class Meta:
        managed = True

4、ordering

返回数据的默认字段排序。

比如 Blog model,如果我们没有在 Meta 里设置 ordering 的话,当我们使用 Blog 筛选数据的时候,会默认按照 id 正序来返回数据,如果我们在 Meta 里设置了 ordering 这个参数,那么当我们在筛选的时候不使用 order_by() 参数,则会按照我们在 ordering 里设置的字段来排序。

比如,当我们设置:

class Blog(models.Model):
    pass
    
    class Meta:
        ordering = ["name"]

设置ordering 为 ["name"] 之后,Blog.objects.first() 返回的第一条数据,就是按照 name 进行正序排序之后的第一条。

如果想倒序排序,在字段名前加上 '-' 减号即可:ordering = ["-name"]

如果想按照多字段排序:ordering = ["name", "tagline"]

以上就是本篇笔记的全部内容,接下来几篇笔记中将逐步介绍 Django 的 model 在筛选中的一些用法,比如 filter,exclude,alias,values 等。

如果想获取更多相关文章,可扫码关注阅读:
image.png


7 声望
5 粉丝
0 条评论
推荐阅读
MySQL笔记十三之时间格式化date_format
本文首发于公众号:Hunter后端原文链接:MySQL笔记十三之时间格式化date_format这一篇笔记介绍如何对 MySQL 中的时间字段进行格式化处理。根据前一篇笔记的内容,现在我们对 book 表添加一个时间字段,created_ti...

Hunter

封面图
花了几个月时间把 MySQL 重新巩固了一遍,梳理了一篇几万字 “超硬核” 的保姆式学习教程!(持续更新中~)
MySQL 是最流行的关系型数据库管理系统,在 WEB 应用方面 MySQL 是最好的 RDBMS(Relational Database Management System:关系数据库管理系统)应用软件之一。

民工哥14阅读 1.9k

封面图
基于Sanic的微服务基础架构
使用python做web开发面临的一个最大的问题就是性能,在解决C10K问题上显的有点吃力。有些异步框架Tornado、Twisted、Gevent 等就是为了解决性能问题。这些框架在性能上有些提升,但是也出现了各种古怪的问题难以...

jysong6阅读 3.9k评论 3

初学后端,如何做好表结构设计?
这篇文章介绍了设计数据库表结构应该考虑的4个方面,还有优雅设计的6个原则,举了一个例子分享了我的设计思路,为了提高性能我们也要从多方面考虑缓存问题。

王中阳Go4阅读 1.7k评论 2

封面图
滚蛋吧,正则表达式!
你是不是也有这样的操作,比如你需要使用「电子邮箱正则表达式」,首先想到的就是直接百度上搜索一个,然后采用 CV 大法神奇地接入到你的代码中?

良许4阅读 2.3k

又一款眼前一亮的Linux终端工具!
今天给大家介绍一款最近发现的功能十分强大,颜值非常高的一款终端工具。这个神器我是在其他公众号文章上看到的,但他们都没把它的强大之处介绍明白,所以我自己体验一波后,再向大家分享自己的体验。

良许5阅读 1.8k

FastAPI性能碾压Flask?
不止一次的听过,FastAPI性能碾压Flask,直追Golang,不过一直没有测试过,今天闲着没事测试一下看看结果。不知道是哪里出了问题,结果大跌眼镜。

二毛erma02阅读 10.2k评论 3

封面图
7 声望
5 粉丝
宣传栏