【问题标题】:Why can't I access class Meta as a attribute of Django Model Class?为什么我不能访问类 Meta 作为 Django 模型类的属性?
【发布时间】:2013-09-19 14:41:53
【问题描述】:

在 Python 中我可以定义:

class Person(object):
   name = "Easwar"
   age = 35
   sex = "male"

   class Occupation:
      name = "my_job"

然后我可以访问它

>> p = Person()
>> p.Occupation.name
>> # prints "my_job"

但是在 Django 中,如果我有一个使用 Class Meta 定义的模型,我就不能这样做

>>> m = SomeDjangoModel()
>>> m.Meta
>>> # prints AttributeError!

这是为什么? Django 的内部 Meta 类与常规 Python 类有何不同?

我对此进行了研究,但没有提出任何类似的问题。 如果我错过了,请原谅我。

提前感谢您的帮助。

【问题讨论】:

    标签: python django django-models


    【解决方案1】:

    Meta属性被metaclass改变了。

    试试:

    SomeDjangoModel._meta
    

    【讨论】:

    • 谢谢,我在我的代码中这样做了,但不鼓励使用“下划线前缀”变量吗?我只是想知道为什么这在 Django 中变得如此不透明
    • 我同意,但它在 Django 代码中被广泛使用(例如 _meta.get_field_by_name)
    • @dreaswar 下划线前缀变量是(按照惯例)Python 中的私有变量
    • @Don 我必须使用类名来访问它吗?有没有办法在 MRO 之前的 mixin 中访问它?我正在尝试使用 self._meta 或 self.Meta 在 mixin 中访问它,但都不起作用
    【解决方案2】:

    在类上定义的Meta 属性是一种定制模式,用于关联和包含将在创建类型时由类的元类自省的附加数据。

    您可以查看ModelBase 元类,了解它如何使用Meta 属性来配置正在构建的结果模型类。

    【讨论】:

    • 谢谢,我现在明白了。它确实在您定义模型时创造了一些您不期望的幕后魔力。您会期望内部 Meta 类及其属性可用。我是 Python 的相对菜鸟,而不是专业的程序员,但我敢说这违反了 Python 的明确原则。很多魔法:)
    • 看起来是这样,但您必须了解,这种设计通常用于内部 API,其中元数据属性及其离散值可能会被转换以修改生成的类感觉继续依赖属性的值或访问路径。它非常优雅地完成的是,它使得不可能依赖可选的Meta 属性,包括其中包含的元数据,而是依赖具有预配置默认值的有保证的_meta 属性。
    • 谢谢,我只是在使用 _meta 以及它捆绑的所有属性和方法做一些工作。我现在可以理解你所说的已经优雅地完成的意思了。让魔法值得!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-15
    • 2011-09-24
    • 2014-12-24
    • 2014-01-15
    • 1970-01-01
    • 2019-10-20
    相关资源
    最近更新 更多