模型管理器可以访问其模型的元属性(`Meta.unique_together`)吗?

Posted

技术标签:

【中文标题】模型管理器可以访问其模型的元属性(`Meta.unique_together`)吗?【英文标题】:Can a model manager access its models' Meta attribute (`Meta.unique_together`)? 【发布时间】:2013-02-27 09:39:15 【问题描述】:

这是我对广义自然键模型管理器的尝试。类似于the docs,只是它尝试(未成功)从 Meta.unique_together 属性中确定自然键字段名称。

class NaturalKeyModelManager(Manager):

    def get_by_natural_key(self, *args):
        field_dict = 
        for i, k in enumerate(self.model.Meta.unique_together[0]):
            field_dict[k] = args[i]
        return self.get(**field_dict)

如果我像这样在 for 循环之前插入调试打印:

print dir(self.model.Meta)

它根本没有列出 unqiue_together 属性:

['__doc__', '__module__', 'abstract']

“抽象”让我有点担心,但另一个调试打印显示我尝试使用自然键管理的模型不是抽象的:

>>> print self.model.Meta.abstract
False

我混合了很多抽象基类。会不会是这个问题?

class MixedModel(NamedModel, TimeStampedModel, VersionedModel, Model):
    objects = NaturalKeyModelManager()

    class Meta:
        unique_together = (('name', 'version',),)

为了完整起见,这里是其中一个 mixin:

class TimeStampedModel(Model):
    created = DateTimeField(_("Created"),     auto_now_add=True, null=True, editable=False)
    updated = DateTimeField(_("Updated"),     auto_now=True,     null=True, editable=True)

    class Meta:
        abstract = True

硬编码的模型管理器工作得很好:

class MixedModelManager(Manager):
    def get_by_natural_key(self, name, version):
        return self.get(name=name, version=version)

【问题讨论】:

【参考方案1】:

为了获得传递给 meta 的实际选项,您应该使用 self.model._meta 而不是 self.model.Meta

【讨论】:

以上是关于模型管理器可以访问其模型的元属性(`Meta.unique_together`)吗?的主要内容,如果未能解决你的问题,请参考以下文章

gis模型构建器无法连接按属性选择

是否可以访问有关 prisma 模型的元数据?

声明的元模型属性工作正常,但继承的元模型属性为 NULL。为啥?

通过 forge 查看器访问的模型的应用程序级别访问管理

属性驱动和模型驱动 [问]

无法通过模型实例访问管理器