django

django-model之元选项

2018-08-22  本文已影响80人  陆_志东

在模型类里面可以进行元选项设置.
模型元数据是“任何不是字段的数据”
元选项举例:

from django.db import models

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

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

可用的元选项

abstract

如果 abstract = True, 就表示模型是 抽象基类

app_label

如果一个模型位于标准的位置之外(应用的models.py 或models 包),该模型必须定义它属于哪个应用
即:如果你在app应用外定义了模型,你必须要使用app_label来告诉django它属于哪个app应用

app_label = 'myapp'

db_table

该模型所用的数据表的名称:

db_table = 'music_album'

ordering

对象默认的顺序,获取一个对象的列表时会按照这个字段排序:
它是一个字符串的列表或元组。每个字符串是一个字段名,前面带有可选的“-”前缀表示倒序。前面没有“-”的字段表示正序。使用"?"来表示随机排序。
例如:按照pub_date字段的倒序排序,这样写:

ordering = ['-pub_date']

要按照pub_date字段的正序排序,这样写:

ordering = ['pub_date']

注意:排序并不是没有任何代价的操作。你向ordering属性添加的每个字段都会产生你数据库的开销。你添加的每个外键也会隐式包含它的默认顺序。

unique_together 联合唯一索引

这个元数据是非常重要的一个!它等同于数据库的联合约束!
举个例子,假设有一张用户表,保存有用户的姓名、出生日期、性别和籍贯等等信息。要求是所有的用户唯一不重复,可现在有好几个叫“张伟”的,如何区别它们呢?(不要和我说主键唯一,这里讨论的不是这个问题)
我们可以设置不能有两个用户在同一个地方同一时刻出生并且都叫“张伟”,使用这种联合约束,保证数据库能不能重复添加用户(也不要和我谈小概率问题)。在Django的模型中,如何实现这种约束呢?

使用unique_together,也就是联合唯一!
比如:
unique_together = (('name', 'birth_day', 'address'),)
这样,哪怕有两个在同一天出生的张伟,但他们的籍贯不同,也就是两个不同的用户。一旦三者都相同,则会被Django拒绝创建。这一元数据经常被用在admin后台,并且强制应用于数据库层面。

unique_together接收一个二维的元组((xx,xx,xx,...),(),(),()...),每一个元素都是一个元组,表示一组联合唯一约束,可以同时设置多组约束。为了方便,对于只有一组约束的情况下,可以简单地使用一维元素,例如:

unique_together = ('name', 'birth_day', 'address')
联合唯一无法作用于普通的多对多字段。

index_together 联合索引,可以出现相同的数据

用来设置带有索引的字段组合:

index_together = [
    ["pub_date", "deadline"],
]

为了方便起见,当需要处理的字段的集合只有一个的时候(集合只有一个!),index_together可以只用一个中括号。也就是只用一个一维列表。

index_together = ["pub_date", "deadline"]

verbose_name

对象的一个易于理解的名称,为单数:
如果此项没有设置,Django会把类名拆分开来作为自述名,比如CamelCase 会变成camel case,

verbose_name = "pizza"

verbose_name_plural

该对象复数形式的名称:
如果此项没有设置,Django 会使用verbose_name + 's'。

# 一般都是和verbose_name一起使用
verbose_name = "pizza"
verbose_name_plural = verbose_name 
上一篇 下一篇

猜你喜欢

热点阅读