前面介绍了 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 等。

本文首发于本人微信公众号:Django笔记。

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

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

Django笔记八之model中Meta参数的使用的更多相关文章

  1. Django model 中meta options之 abstract

    当abstract=True时,这个model就变成了abstrct base class,那这个基类有什么特性呢? 当某一model中设置了abstract=True时,就会使该model中的字段都 ...

  2. Django model 中meta options

    之前学了abstract,这是后续的一些options app_label: app_label的作用是:如果一个model定义不在INSTALLED_APPS中,那么此时就需要声明,这个model的 ...

  3. Mybatis笔记八:MyBatis中#{}和${}的区别

    先给大家介绍下MyBatis中#{}和${}的区别,具体介绍如下: 1. $将传入的数据直接显示生成在sql中 2. #方式能够很大程度防止sql注入. 3.$方式无法防止Sql注入. 4.$方式一般 ...

  4. (八)Struts2中的参数封装

    一.静态参数封装 什么是静态参数? 静态参数就是硬编码的,不可随意改变. 例子: (1)我们首先创建一个Action类,里面有两个参数,用来封装请求参数 public class User exten ...

  5. MYSQL初级学习笔记八:MySQL中常用的函数!(视频序号:初级_45-50)

    知识点十:MySQL中的函数(45-50) 数学函数: 名称 描述 CEIL() 进一取整 FLOOR() 舍一取整 MOD 取余数(取摸) POWER() 幂运算 ROUND() 四舍五入 TRUN ...

  6. scrapy的request的meta参数是什么意思?

    作者:乌尔班链接:https://www.zhihu.com/question/54773510/answer/146971644来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注 ...

  7. Django model 中的 class Meta 详解

    Django model 中的 class Meta 详解 通过一个内嵌类 "class Meta" 给你的 model 定义元数据, 类似下面这样: class Foo(mode ...

  8. Django---ORM的常用字段和自定义字段,DjangoORM字段与数据库类型对应,字段参数和Meta的参数,Django的admin操作,13中orm操作方法,单标的双下方法

    Django---ORM的常用字段和自定义字段,DjangoORM字段与数据库类型对应,字段参数和Meta的参数,Django的admin操作,13中orm操作方法,单标的双下方法 一丶ORM常用字段 ...

  9. Django(十八)Model操作补充

    参考博客:http://www.cnblogs.com/wupeiqi/articles/6216618.html 1. 创建类 class UserInfo(model.Model): age = ...

  10. Django model 中的字段解释

    Django 通过 models 实现数据库的创建.修改.删除等操作,本文为模型中一般常用的类型的清单,便于查询和使用: AutoField:一个自动递增的整型字段,添加记录时它会自动增长.你通常不需 ...

随机推荐

  1. C语言||一作业03

    1.作业头 这个作业属于哪个课程 https://edu.cnblogs.com/campus/zswxy/SE2020-3/ 这个作业目标在哪 https://edu.cnblogs.com/cam ...

  2. elasticsearch 根据主键_id更新部分字段

    package com.better517na.ebookingbusiservice.helper;import com.alibaba.fastjson.JSON;import com.aliba ...

  3. 使用Python实现给企业微信发送allure报告,并实现微信查看

    1.注册企业微信 搜索企业微信直接注册 2.创建应用 3.查看企业id.Secret.应用id.部门id 4.发送代码 import os import jenkins import requests ...

  4. Loadrunner——调试及脚本编译

    调试一般用于运行代码是出现的错误. loadrunner调试方式:断点.单步跟踪.日志输出.值查看器等, 断点设置 断点插入的位置:非空行或非语句的起始,简单来说呢就是断点打在函数前(取消断点就直接在 ...

  5. 【pyqtgraph】pyqtgraph可移动竖线LineSegmentROI的拖拽事件相关

    情景 Python+PyQt+pyqtgraph读取数据绘图,并在图像上添加了LineSegmentROI带handle的竖线(hanlde是为了RectROI的拖动),现要实现竖线可以直接拖动,并在 ...

  6. DML操作数据

    添加数据 insert into 表名(列的名称)(数据);ps:列的名称用`  `包围可以减少出错 添加全部数据的时候可以把列的名称省略: 修改数据 update 表名  set 列名=数据,列名= ...

  7. (1)从txt读取GPS数据 真实GPS和slam定位GPS匹配 坐标系ecef和enu转化 计算均方根误差和单帧误差

    #!/usr/bin/python # -*- coding: UTF-8 -*- import numpy as np import os #==========================1坐 ...

  8. Java基础Day6-面向对象

    一.面向对象编程(Object-Oriented Programming, OOP) 面向对象编程的本质就是:以类的方式组织代码,以对象的组织(封装)数据. 从认识论的角度:先有对象后有类.对象是具体 ...

  9. Spring-IoC中Set和构造器注入

    新建Maven工程 修改pom文件 1 <?xml version="1.0" encoding="UTF-8"?> 2 <project x ...

  10. 对volatile修饰的变量使用memset函数

    背景 今天面试了一家公司,面试官问了我一个开放性的问题.大致意思是,为什么对volatile修饰的变量调用memset函数,编译的时候会报错.当然,我是不知道为什么啦.之前没有遇到过嘛.不过我还是做了 ...