Oto moja próba uogólnionego menedżera modelu naturalnego klucza. To jest jak the docs z tym, że próbuje (bezskutecznie) ustalić nazwy pól klucza naturalnego z atrybutu Meta.unique_together.Czy menedżer modeli może uzyskać dostęp do atrybutu Meta jego modeli ("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)
Gdybym wstawić drukiem debugowania tuż przed pętli tak:
print dir(self.model.Meta)
ona nie notować unqiue_together atrybutu na wszystkich:
['__doc__', '__module__', 'abstract']
do 'streszczenie' Trochę mnie to zmartwiło, ale inny wydruk debugowania pokazuje, że model, który próbuję zarządzać naturalnymi kluczami, nie jest abstrakcyjny:
>>> print self.model.Meta.abstract
False
Mieszam w wielu abstrakcyjnych klasach bazowych. Czy to może być problem?
class MixedModel(NamedModel, TimeStampedModel, VersionedModel, Model):
objects = NaturalKeyModelManager()
class Meta:
unique_together = (('name', 'version',),)
Dla kompletności oto jeden z wstawek:
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
twardego kodowane menedżer modelu działa dobrze:
class MixedModelManager(Manager):
def get_by_natural_key(self, name, version):
return self.get(name=name, version=version)