模型管理器可以访问其模型的元属性(`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`)吗?的主要内容,如果未能解决你的问题,请参考以下文章