问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

Django学习第三天:meta配置详解

创作时间:
作者:
@小白创作中心

Django学习第三天:meta配置详解

引用
51CTO
1.
https://blog.51cto.com/u_12440558/12800020

Django框架中的模型Meta配置是一个非常强大的工具,它允许开发者自定义许多数据库层面的行为,比如表名、排序规则、权限、唯一性约束等。通过合理的使用Meta类的各种选项,可以更好地控制Django ORM与数据库的交互方式。本文将详细介绍Django模型中Meta配置的各项功能及其具体用法。

Django的模型中meta配置详解

在 Django 中,Meta 类是一个内嵌类,用于在模型(Model)中定义一些元数据(metadata)。这些元数据并不会直接影响模型的字段,而是提供一些关于模型的附加信息,例如数据库表名、排序规则、权限等。

1. Meta 类基础

Meta 类必须定义在模型类的内部,并且其内容必须是静态的。Meta 的设置不会影响数据库表中的数据,而是影响 Django ORM 对模型进行操作的方式。

2. 常用的 Meta 配置项

2.1. db_table

db_table 用于指定模型对应的数据库表名。默认情况下,Django 会使用模型类名的小写形式作为数据库表名。如果你需要自定义表名,可以使用 db_table

class Author(models.Model):
    name = models.CharField(max_length=100)
    class Meta:
        db_table = 'custom_author_table'  # 指定数据库表名

2.2. ordering

ordering 用于指定查询集(queryset)的默认排序方式。它是一个包含字段名的元组,Django 会根据这个字段排序返回的数据。

class Book(models.Model):
    title = models.CharField(max_length=200)
    publication_date = models.DateField()
    class Meta:
        ordering = ['publication_date']  # 按照 publication_date 排序

可以指定多个字段,也可以使用负号 - 来进行降序排序:

class Book(models.Model):
    title = models.CharField(max_length=200)
    publication_date = models.DateField()
    class Meta:
        ordering = ['-publication_date', 'title']  # 先按 publication_date 降序,然后按 title 升序

2.3. verbose_nameverbose_name_plural

verbose_name 用于指定模型的单数形式名称,verbose_name_plural 用于指定复数形式名称。这些名称主要用于 Django 的管理界面(Admin)和模型的字符串表示。

class Author(models.Model):
    name = models.CharField(max_length=100)
    class Meta:
        verbose_name = '作者'
        verbose_name_plural = '作者们'
  • verbose_name:表示模型在单数形式下的名称。
  • verbose_name_plural:表示模型在复数形式下的名称。

2.4. unique_togetherconstraints(在 Django 2.2+ 中可以使用 constraints

unique_together 是一个用于指定多个字段组合唯一性的元选项。在 Django 2.2 以后,推荐使用 constraints 来代替 unique_together,因为 constraints 提供了更多灵活性。

class Book(models.Model):
    title = models.CharField(max_length=200)
    author = models.ForeignKey(Author, on_delete=models.CASCADE)
    class Meta:
        unique_together = ('title', 'author')  # title 和 author 的组合唯一

或者在 Django 2.2+ 使用 constraints

from django.db import models
class Book(models.Model):
    title = models.CharField(max_length=200)
    author = models.ForeignKey(Author, on_delete=models.CASCADE)
    class Meta:
        constraints = [
            models.UniqueConstraint(fields=['title', 'author'], name='unique_book_author')
        ]

constraints 不仅支持唯一性约束,还可以用来创建其他数据库级别的约束(例如检查约束等)。

2.5. index_togetherindexes

index_together 用于指定多个字段组合时应创建联合索引。在 Django 2.2 之后,推荐使用 indexes 来代替 index_together,因为 indexes 提供了更多定制选项。

class Book(models.Model):
    title = models.CharField(max_length=200)
    publication_date = models.DateField()
    class Meta:
        index_together = ['title', 'publication_date']  # 创建 title 和 publication_date 的联合索引

或者在 Django 2.2+ 使用 indexes

from django.db import models
class Book(models.Model):
    title = models.CharField(max_length=200)
    publication_date = models.DateField()
    class Meta:
        indexes = [
            models.Index(fields=['title', 'publication_date'])  # 创建联合索引
        ]

indexes 允许你更细致地控制索引类型,例如可以创建全文索引、B-tree 索引等。

2.6. default_related_name

default_related_name 用于指定反向关系的默认名称。每当你使用 ForeignKeyOneToOneFieldManyToManyField 时,Django 会自动为这些关系生成反向引用的名称。如果你不喜欢 Django 默认生成的名称,可以通过 default_related_name 自定义。

class Book(models.Model):
    title = models.CharField(max_length=200)
    author = models.ForeignKey(Author, on_delete=models.CASCADE)
    class Meta:
        default_related_name = 'books_written'  # 反向关系的名称是 'books_written'

2.7. permissions

permissions 用于为模型添加自定义的权限。它是一个元组列表,其中每个元素是一个包含权限名称和描述的元组。

class Book(models.Model):
    title = models.CharField(max_length=200)
    class Meta:
        permissions = [
            ('can_view_book', 'Can view book'),
            ('can_edit_book', 'Can edit book'),
        ]

自定义权限可以用于 Django 的权限系统,以便进行细粒度的访问控制。

2.8. managed

managed 用于指定 Django 是否应自动创建和删除数据库表。如果设置为 False,Django 将不会为该模型自动创建数据库表,也不会在 migrate 时删除它。通常用于自定义数据库表或与其他系统交互时的情况。

class CustomModel(models.Model):
    name = models.CharField(max_length=100)
    class Meta:
        managed = False  # 不让 Django 管理这个表

2.9. app_label

app_label 用于指定模型所属的应用名称。通常,Django 会自动根据模型所在的应用来推断模型的 app_label。如果你有模型需要放置到不同的应用中,可以通过 app_label 指定。

class CustomModel(models.Model):
    name = models.CharField(max_length=100)
    class Meta:
        app_label = 'myapp'  # 指定模型属于 'myapp' 应用

2.10. select_on_save

select_on_save 用于指示是否应在保存对象时直接刷新该对象。这通常用于优化数据库查询操作。默认值为 True,表示保存后会立即刷新对象。

class CustomModel(models.Model):
    name = models.CharField(max_length=100)
    class Meta:
        select_on_save = False  # 禁止保存后刷新对象

3. 总结

Django 模型中的 Meta 类是一个非常强大的工具,它允许你自定义许多数据库层面的行为,比如表名、排序规则、权限、唯一性约束等。通过合理的使用 Meta 类的各种选项,你可以更好地控制 Django ORM 与数据库的交互方式。

常用的 Meta 配置项包括:

  • db_table:设置数据库表名
  • ordering:指定默认的排序方式
  • verbose_name/verbose_name_plural:指定模型的名称
  • unique_together/constraints:设置唯一性约束
  • index_together/indexes:设置索引
  • permissions:设置自定义权限
  • managed:控制是否让 Django 管理数据库表
  • app_label:指定模型所属的应用

Meta 类使得 Django 的模型系统变得更加灵活和强大,有助于满足复杂的数据库设计需求。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号