这是我对广义自然键模型管理器的尝试。就像文档一样,除了它尝试(不成功)从 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',),)
为了完整起见,这里是其中一种混合:
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)