5
這是我在一個廣義的自然關鍵模型管理器中的嘗試。它就像the docs,除了它嘗試(不成功)從Meta.unique_together屬性中確定自然鍵字段名稱。模型管理器可以訪問模型的元屬性(`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)
如果我之前插入調試打印的對像這樣的循環:
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)