class Meta

指的是除数据以外的所有内容,例如排序方式、数据库表名、人类可读的单数或复数形式的名称等等,所有的这些不是必须的,但是在实际使用的过程会给予你极大的帮助。
每个模型都可以有自己的元类,但元类只对自己所在的模型有效。

from django.db import models


class Comment(models.Models):
    content = models.CharField(max_length=256)
    comment_time = models.DateTimeField(auto_now_add=True)

    class Meta:
        ordering = ["-comment_time"]
        verbose_name = "评论"
        verbose_name=plural = verbose_name

元类选项

abstract

如果abstract = True,那么该模型会被认定为一个抽象模型。抽象模型不会实际生成数据库表,而是作为其他模型的父类,被集成使用。

app_label

如果定义模型的app没有在INSTALLED_APPS中注册,那么必须通过此元选项生命属于哪个app。

db_table

指定数据库种当前模型生成的数据表的表明。

get_latest_by

Django管理器尾门提供了latest()和earliest()方法,分别表示最近一个和最早一个数据对象。get_latest_by可以指定一个类似DateField、DateTimeField或者IntegerField这种可以排序的字段,作为latest()和earliest()方法的排序依据。

order_with_respect_to

根据指定的字段进行排序,通常用于关系字段。

from django.db import models


class Question(models.Model):
    text = models.TextField()


class Answer(models.Model):
    questiom = models.ForeignKey("Question", on_delete=models.CASCADE)

    class Meta:
        order_with_respect_to = "question"

添加此选项只后,Django会自动提供两个API:get_RELATED_order()和set_RELATED_order(),其中的RELATED用模型名的小写代替。

# 假设有一个id = 1的Question对象,其对应的Answer对象id列表为[1, 2, 3]
# 获取关联Question对象的所有Answer对象列表
>>> question = Question.objects.get(id=1)
>>> question.get_answer_order()
[1, 2, 3]

# 设置关联Question对象的所有Answer对象列表的顺序
>>> question.set_answer_order([3, 1, 2])

同时关联对象也会获得get_next_in_order()和get_previous_in_order()两个方法,用于访问特定顺序的对象。

>>> answer = Answer.objects.get(id=2)
>>> answer.get_next_in_order()
<Answer: 3>
>>> answer.get_previous_in_order()
<Answer: 1>

ordering

指定改模型生成的所有对象的排序方式,接受一个字段名组成的元祖或列表。默认为升序排列,如果在字段名前面加上”-“则表示以降序排列,如果使用”?”则表示随机排序。

ordering = ["pub_date"]  # 以pub_date字段进行升序排列
ordering = ["-pub_date"]  # 以pub_date字段进行降序排列
ordering = ["-pub_date", "author"]  # 先以pub_date字段进行降序排列,再以author字段进行升序排列

permissions

用于当创建对象时增加额外的权限。它接受一个所有元素都是二元元组的列表或元组,每个元素都是(权限代码,直观权限名称)的格式。

default_permissions

Django默认给所有的模型设置add,change,delete的权限,也就是增删改。也可以自定义这个选项,例如设置为一个空列表,则表示不需要默认权限,但是该操作必须在执行migrate命令之前。

indexes

接受一个应用在当前模型上的索引列表。

from django.db import models


class Customer(models.Model):
    first_name = models.CharField(max_length=20)
    last_name = models.CharField(min_length=20)

    class Meta:
        indexes = [
            models.Index(fields=["last_name", "first_name"]),
            models.Index(fields=["first_name"], name="first_name_idx"),
        ]

unique_together

它等同于数据的联合约束。联合为无法作用于普通的多对多字段。

unique_together = (('name', 'birth_day', 'address'),)

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

unique_together = ("name", "birth_day", "address")

verbose_name 与 verbose_name_plural

  • verbose_name:用于设置模型对象的只管、人类可读的名称,可以使用中文。
  • verbose_name_plural:由于英文存在单复数形式,所以它就对应着模型对象的复数形式。
0条评论

相关推荐

django教程

r

Django 2019-05-20 10:53:53

Celery

celery学习资料

Django 2019-05-25 18:41:55

Django-rest-framework教程

django-rest-framework教程。

Django 2019-07-18 16:33:26

django实用资料

django项目从0到1自己总结的实用的资料,大部分常用的功能这里都有

Django 2019-05-08 18:21:34