关于django:Django笔记八之model中Meta参数的使用

30次阅读

共计 1858 个字符,预计需要花费 5 分钟才能阅读完成。

后面介绍了 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 参数的应用

如果想获取更多相干文章,可扫码关注浏览:

正文完
 0