これは、一般化された自然キー モデル マネージャーに対する私の試みです。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']
'abstract' は少し気になりましたが、別のデバッグ プリントは、私が自然キーで管理しようとしているモデルが抽象的ではないことを示しています。
>>> print self.model.Meta.abstract
False
多くの抽象基本クラスを混在させています。それが問題でしょうか?
class MixedModel(NamedModel, TimeStampedModel, VersionedModel, Model):
objects = NaturalKeyModelManager()
class Meta:
unique_together = (('name', 'version',),)
完全を期すために、ミックスインの 1 つを次に示します。
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)