2014-09-08 2 views
1

Класс Django Model определяет метод __repr__, который объединяет имя класса модели со строковым представлением экземпляра, так что типичный объект будет отображаться в оболочке или в средствах отладки в следующем формате:Получить Django для включения идентификатора модели в строковое представление всех экземпляров модели для отладки

<MyClass: string description of instance> 

То, что я хочу, чтобы все мои объекты экземпляров, чтобы показать их идентификаторы в их __repr__, например,

Это для удобства отладки.

Теперь было бы довольно легко (в принципе) переопределить методы __unicode__ (которые генерируют строковое описание экземпляров), чтобы включить идентификаторы или, если на то пошло, переопределить мои методы __repr__ (или иметь всю мою модель классы производятся из базового класса, который делает это).

Однако я работаю с существующей базой кода и хочу избежать изменения всех существующих определений классов модели для этого. Быстрый и грязный способ изменить ситуацию - отредактировать исходный код для __repr__ в классе модели Django. Но это создает проблемы с развертыванием, так как мой проект всегда развертывает сторонние библиотеки, такие как Django from pip.

Итак: как я могу заставить Django включать идентификатор в список для всех экземпляров объектов, не изменяя исходный код Django или определения класса модели проекта?

ПРИМЕЧАНИЕ: Я думаю, что какой-то патч обезьяны до Model.__repr__ должен сделать трюк, но я не уверен, что это сработает, и если да, то где в моем проекте Django это сделать.

ответ

1

Monkeypatching Model.__repr__ должен работать. Что-то вроде:

def debug_repr(self): 
    return "<{} {}: {}>".format(self.__class__.__name__, self.pk, self) 

Model.__repr__ = debug_repr 

См the implementation of __repr__()in the source code, если вы хотите, чтобы сделать его более устойчивым.

Где вы это сделаете, это зависит от вашей настройки отладки. Если вы работаете в консоли, вы можете просто ввести это напрямую. Если вы хотите поместить его в код, но не мешать другим развертываниям, вам, вероятно, следует создать новый файл настроек для вашей среды отладки, а затем запустить этот путь.

+0

Я не мог заставить его работать, включив его в свой файл настроек из-за некоторых зависимостей импорта, но он работает, включив его в файл models.py одного из моих приложений. (Приложения загружаются Django, включая файлы models.py после загрузки настроек). – Ghopper21