“class Meta:”在 Django 和 Django REST Framework 中做什么?

Yap*_*eng 1 metadata class django-models django-views django-rest-framework

我试图弄清楚class Meta:Django 到底做了什么。

我在 DRF 中遇到了下面的代码,但不确定为什么下面class Meta:model = Userfields = [...]。对创建数据库有帮助吗?

from django.contrib.auth.models import User, Group
from rest_framework import serializers


class UserSerializer(
        serializers.HyperlinkedModelSerializer):
    class Meta:
        model = User
        fields = ['url', 'username', 'email', 'groups']
Run Code Online (Sandbox Code Playgroud)

class Meta:Django 中使用的有什么不同,如下所示。

from django.db import models

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

    class Meta:
        ordering = ["horn_length"]
        verbose_name_plural = "oxen"
Run Code Online (Sandbox Code Playgroud)

我试图从 Django 和 DRF 文档中获得进一步的理解,但是我没有看到DRF的解释model = ...和使用。fields = [...]class Meta

Mar*_*ers 5

该类Meta只是一个方便的地方来对 DRF 需要调整其配置的元数据(即有关数据的数据)进行分组,但将其与类本身的属性分开。这种分离允许 Django Rest Framework(以及更广泛的 Django Framework 生态系统)避免配置和实际类定义之间的冲突。

使用内部Meta类是整个 Django 中的常见模式,因为这允许您将此配置与类的字段分开,并以易于阅读且易于框架查找的方式保持其与类的连接。DRF selialiser 类通常应具有一个或多个字段来帮助将数据转换为序列化形式,但HyperlinkedModelSerializer如果您告诉基类您想要序列化什么模型,则基类可以为您生成这些字段。类上的字段Meta告诉它您想要序列化User模型中的特定字段。

通过将此配置放在内部Meta类上,它们将保留在与主类不同的命名空间中,但同时保持与它们要配置的类的连接。假设一个模型有一个名为modelfields的字段。如果HyperlinkedModelSerializer在子类本身中找到所需的配置,那么您永远无法生成可以使用modelfields字段处理某些内容的序列化器!

如果您想知道可以在内部Meta类上使用哪些不同选项,您需要阅读API 指南部分中的ModelSerialiser和文档。HyperlinkedModelSerializer

对于 Django Models,可以参考Django 文档的ModelMeta章节。正如我上面所说,这是相同的概念,但这里的Meta类配置模型支持的数据库字段以及模型如何与您可能定义的其他数据库模型相关。

最后但并非最不重要的一点是,这里还有另一个答案将术语MetaPython Metaclasses混淆了,这是一个非常不同的概念。虽然 DRF 和 Django 模型类的内部实现严重依赖元类(class Meta:用于配置框架功能的定义),但它们不是元类。它们是普通类,仅因为它们提供了方便的命名空间而被使用。