Django的models.Model类提供了一些选项,用于配置和管理模型。其中,Meta类是models.Model的子类,它提供了一些额外的选项,用于配置模型的属性和行为。

示例

# models.py

class User(models.Model):
    """用户类"""
    name = models.CharField(max_length=20)
    create_date = models.DateField(auto_now_add=True)

    # 使用自定义的模型管理器(默认的objects就不会在使用)
    objects = UserManager()

    def __str__(self):
        return self.name

    class Meta(object):
        # 定义表名
        db_table = "user"
        # 定义在管理后台显示的名称
        verbose_name = '用户'
        # 定义复数时的名称(去除复数的s)
        verbose_name_plural = verbose_name
        # 根据日期倒叙(从大到小)排序
        ordering = ['-create_date'] 

下面详细介绍了Meta类中可用的选项及其含义。

1. app_label

django.db.models.options.AppLabelClass 是 Django 中的一个类,用于指定一个模型所属的应用程序。

在Django中,每个模型都必须指定一个 app_label 属性,该属性定义了模型所属的应用程序的名称。

app_label 属性的值是一个字符串,它应该是应用程序名称的唯一标识符。

在Django中,应用程序名称通常是一个字符串,以小写字母开头,后跟一个点和一个描述应用程序类型的字符串。例如,myapp 是一个应用程序名称,myapp.models 是一个包含模型的完整应用程序名称。

在 Django 中,每个应用程序都应该有一个 app_label 属性,并且应该使用 django.db.models.options.set_label_name 方法来设置该属性。

在 Django 1.10 版本之后,set_label_name 方法已被弃用,建议使用 options.注册模型类 来代替。

django.db.models.options 模块中,还有一个名为 Options 的类,它用于管理模型的元数据。

可以使用 Options 类中的 app_label 属性来获取或设置模型所属的应用程序的名称。

这个选项只在一种情况下使用,就是你的模型不在默认的应用程序包下的models.py文件中,这时候需要指定你这个模型是哪个应用程序的。

指定模型所属的应用程序标识符。

  • 默认为'django_content_models'

2. db_table

  • 指定模型在数据库中的表名。

  • Django有一套默认的按照一定规则生成数据模型对应的数据库表明。

在项目中,随着APP数量增加,数据库表越多,为了看起来简单,功能又具有共性的表可以自定义表名,大型项目不建议修改表名(别问为什么,问就是不知道,哈哈)。

  • 默认为模型类名的驼峰式命名

3. ordering

指定模型在查询结果中排序的字段。

这是一个字符串的元组或列表,每一个字符串都是一个字段和用一个可选的,表明降序的'-'构成。当字段名前面没有'-'时,将默认使用升序排列。使用'?'将会随机排列

ordering=['order_date']         # 按订单升序排列

ordering=['-order_date']        # 按订单降序排列,-表示降序

ordering=['?order_date']        # 随机排序,?表示随机

ordering=['-pub_date','author'] # 以pub_date为降序,在以author升序排列
  • 默认为('natural', {'fields': [], 'order_by': False}),即按照自然顺序排序。

4. unique_together

  • 指定模型的唯一性约束的字段组合。

  • 字段列表中的字段名以括号括起来,每个括号内的字段名表示一个约束。

例如

# 表示 field1 和 field2字段的组合必须唯一
unique_together = (('field1', 'field2'),)
  • 一个ManyToManyField不能包含在unique_together中。如果你需要验证关联到ManyToManyField字段的唯一验证,尝试使用signal(信号)或者明确指定through属性。

5. index_together

指定模型的索引约束的字段组合。字段列表中的字段名以括号括起来,每个括号内的字段名表示一个索引。例如index_together=(('field1', 'field2'),)表示field1field2字段的组合应该创建索引。

6. abstract

如果设置为True,则将模型定义为抽象模型

抽象模型是一个只包含元信息(如__module____name__属性)的模型,没有实际的数据表。(所谓抽象类是不会对应数据库表的,用来归纳一些公共属性字段,然后它的子类可以继承这些字段。)

  • 默认为False

7. proxy

如果设置为True,则将模型定义为代理模型。

代理模型是一个派生自另一个模型的模型,它继承了原始模型的属性和方法,但使用不同的数据表。默认为False

8. swappable

如果设置为True,则允许其他应用程序定义与当前应用程序名称相同的模型。默认为False

9. swappable_setting

如果设置了swappableTrue,则指定用于定义模型的自定义类名。默认为'django.db.models.swappable_setting'

10. auto_now

设置模型的自动时间戳字段(如createdmodified)为当前时间。可以设置多个字段,它们将按顺序自动插入时间戳。

11. auto_now_add

设置模型的自动时间戳字段为当前时间,并在创建新实例时自动插入。

12. concrete

如果设置为True,则将模型定义为具体模型。具体模型是一个派生自django.db.models.base.Model的模型,没有继承自django.db.models.Model。默认为False

13. proxy_for_model

指定代理模型的实际派生自哪个模型。

14. permissions

permissions主要是为了在Django Admin管理模块下使用的,如果你设置了这个属性可以让指定的方法权限描述更清晰可读。

Django自动为每个设置了admin的对象创建添加,删除和修改的权限。

permissions = (('can_deliver_pizzas','Can deliver pizzas'))

这些选项可以根据需要进行自定义和调整,以实现模型特定的行为和约束。

声明:如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。None#python87.com