Ошибка Python Django при попытке добавить декораторы к моделям. Менеджер - PullRequest
1 голос
/ 22 января 2012

Вот моя проблема.Я пытаюсь добавить инструментарий в мой код, основанный на Django.Вот что я делаю:

def trace(func):
  def wrapped(*args, **kwargs):
    print func.__name__
    return func(*args, **kwargs)
  return wrapped

def trace_class_func(kclass, func):
  setattr(kclass, func.__name__, classmethod(trace(func.im_func)))


# Trace all the calls to 'get_query_set' from all the classes or subclasses of Manager
tracer.trace_class_func(models.Manager, models.Manager.get_query_set)

Этот класс хранится внутри модуля "tracer", и я добавляю "tracer" в раздел INSTALLED_APPS файла settings.py (обратите внимание, что добавлен модуль 'tracer')в конце).

Однако, когда я запускаю свое приложение, я получаю эту ошибку:

Тип исключения: AttributeError в / settings / интеграций / Значение исключения: тип объекта "UserManager" не имеетатрибут 'model'

Это происходит внутри django / db / models / manager.py в функции get_query_set.

EDIT: дело в том, что когда я пытался напечатать содержимое класса UserManager (которыйявляется производным от models.Manager), распознавались только поля, определенные в UserManager, и ни одно из полей базового класса:

self: <class 'django.contrib.auth.models.UserManager'>
keys: {'__module__': 'django.contrib.auth.models', 'create_superuser': <function create_superuser at 0x10d44eaa0>, 'create_user': <function create_user at 0x10d44ea28>, 'make_random_password': <function make_random_password at 0x10d44eb18>, '__doc__': None, '__init__': <function __init__ at 0x10d44e9b0>}

Как видно, даже функции, определенные UserManager, являются толькобудучи напечатанным, а не определенным моделями. Менеджер.Не уверен, почему это происходит.

Кто-нибудь знает, что здесь происходит?Потому что, когда я запускаю этот трассировщик на своих пользовательских классах (включая базовые и унаследованные классы), он отлично работает, поэтому я предполагаю, что это ошибка Django, либо в моей конфигурации, либо что-то еще.

1 Ответ

0 голосов
/ 23 января 2012

Проблема в том, что get_query_set не является методом класса. Сам экземпляр игнорируется и, следовательно, self! = Instance, это класс, у которого нет модели.

Метод класса получает сам класс в качестве первого аргумента, а не экземпляра.

class MyClass(object):
   @classmethod
   def foo(cls):
       print "i'm a class: {0}".format(cls)
# i'm a class: __main__.MyClass

class MyClass(object):
   def foo(self):
       print "i'm a class instance: {0}".format(self)
# i'm a class instance: <__main__.MyClass instance at 0x1064abef0>
...