Django 模型元属性

Django 模型元属性,元属性是“模型中任意非模型字段的内容”,例如排序功能、数据表名、人类可读的名字(单数形式和复数形式),所有元属性都是可选的。

通过在模型中添加一个叫作Meta的子类,定义模型元属性。

在详细介绍模型元属性之前,先看一下如何在Django模型中使用元属性:

# www.coolcou.com
from django.db import models

class Ox(models.Model):
    horn_length = models.IntegerField()

    class meta:
        ordering = ["horn_length"]
        verbose_name_plural = "oxen"

通过设置元属性,上面Ox模型将会默认使用horn_length排序,在Admin页面显示的复数形式名字叫Oxen。

  1. abstract
    如果设置abstract = True,当前模型将成为一个抽象类。例如:
# www.coolcou.com
from django.db import models
class CommonInfo(modeks.Model):
    name = models.CharField(max_length=100)
    age = models.PositiveIntegerField()

    class Meta:
        abstract = True

class Student(CommonInfo):
    home_group = models.CharField(max_length=5)
  1. app_label
    如果模型定义没有注册到INSTALLED_APPS,那么就必须使用app_label选项在Meta类指定所属的应用程序名字。

  2. db_table
    当前模型所使用的数据表名。

默认情况下,Django会自动根据应用程序名+模型名生成数据表名。例如前面示例代码中的polls应用程序,生成的数据表叫作polls_questionpolls_choice

如果觉得Django自动生成的表名不好看,那么可以通过db_table来重新定义表名。在这里即使表名不合法也没关系,Django会替我们处理它,不过最好还是使用合规的名字。

  1. Ordering
    默认的排序字段,当从数据库中查找数据时会按照Ordering指定的字段排序显示。

该属性是一个元组、列表或者查询表达式,每一个元组或列表的元素就是一个字段名,默认是正序排序,如果给字段名前添加一个“-”符号则会按照倒序排序。如果在字段名前面加“?”的话就会随机提取数据。

例如,按照pub_date倒序、author正序查找数据:

ordering = ['-pub_date', 'author']

在Django 2.0中增加了对查询表达式的支持,例如根据author字段进行排序,当author字段值为null时,数据放在最后显示:

from django.db.models import F
ordering = [F('author').asc(null_last=True)]
  1. Indexes
    用来定义数据库索引,形式如下:
from django.db import models
    first_name = models.CharField(max_length=100)
    last_name = models.CharField(max_length=100)

    class Meta:
        indexes = [
            models.Index(fields=['last_name', 'first_name']),
            models.Index(fields=['first_name'], name='first_name_idx'),
        ]
  1. unique_together
    为数据库表设置联合主键,形式如下:
unique_together = (("driver", "restaurant"),)

联合主键是一个由元组组成的元组,每一个元组中的字段在数据库中的值的组合必须是唯一的。
如果只有一个联合主键,可以简化unique_together,例如:

unique_together = ("driver", "restaurant")
  1. verbose_name
    便于人类读取的模型名称,单数形式。
    代码形式如下:
verbose_name = "pizza"

如果没有指定verbose_name,Django会根据模型类名自动创建verbose_name,如模型CamelCase对应的verbose_name为camel case。

  1. verbose_name_plural
    便于人类读取的模型名称,复数形式。
    代码形式如下:
verbose_name_plural = "stories"

如果没有指定verbose_name_plural的话,Django会自动生成,形式为:verbose_name + “s”

酷客教程相关文章:

赞(0)

评论 抢沙发

评论前必须登录!