Это и Pythoni c, и Djangoi c. Это может быть продемонстрировано тем фактом, что этот шаблон используется в самом Django.
# django/contrib/admin/models.py
class LogEntry(models.Model):
# Code omitted for brevity
content_type = models.ForeignKey(
ContentType,
models.SET_NULL,
verbose_name=_('content type'),
blank=True, null=True,
)
# Code omitted for brevity
def get_edited_object(self):
"""Return the edited object represented by this log entry."""
return self.content_type.get_object_for_this_type(pk=self.object_id)
# Code omitted for brevity
Метод LogEntry.get_edited_object()
вызывает метод ContentType.get_object_for_this_type()
.
# django/contrib/contenttypes/models.py
class ContentType(models.Model):
# Code omitted for brevity
def get_object_for_this_type(self, **kwargs):
"""
Return an object of this type for the keyword arguments given.
Basically, this is a proxy around this object_type's get_object() model
method. The ObjectNotExist exception, if thrown, will not be caught,
so code that calls this method should catch it.
"""
return self.model_class()._base_manager.using(self._state.db).get(**kwargs)
# Code omitted for brevity
Использование этот шаблон является распространенным и рекомендуемым. Функции, которые работают с экземпляром вашей модели, должны в максимально возможной степени быть методом этого класса модели. Это просто хорошее программирование на Pythoni c.
Как сказал Ахмед ...
Да, "нет другого решения".