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

标签 django django-models metaclass natural-key

这是我尝试使用广义自然键模型管理器的尝试。类似于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)

最佳答案

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

关于django - 模型管理员可以访问其模型的Meta属性(`Meta.unique_together`)吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15351676/

相关文章:

python - 无法在 Django 1.11.4 中导入模式

无法使用 IPV6 地址访问 Django 项目

python - Django : Which approach is better [ virtualenv + pip ] vs [manually carrying packages in svn]?

python - Django -- 新字段 : How to set default callable for existing objects

python - 有没有更简洁的方法来使用 Django ORM 链接过滤器?

Django modelform 根据其他字段选择删除 "required"属性

python使用内部类动态创建类

python - 无法从 CreateView 重定向

python - 如何在 Python 中将参数传递给 __metaclass__

python - Python 中的元类是什么?