在 Django 中获取模型 类 的调用堆栈
get call stack for Model Classes in Django
在 Django 中,我想在模型中获取 classes 的调用堆栈;随叫随到,并记录下来。 Django 模型使用 QuerySet API 来访问模型 class 的对象。
说,我们已经定义了模型 class Abc
,其他 django 应用程序使用 QuerySet API.
调用它
例如-
Abc.objects.filter()
Abc.objects.get()
等
每当通过 QuerySetAPI 调用特定模型 class Abc
时,我想添加回溯。
追溯是正确的方法吗?我应该用别的东西吗?
我在 Mac.Python 上使用 Python 2.7、Vegrant、Django 1.4.20
如果我没理解错的话,这就是我的解决方案。对 queryset api 的任何调用都会打印调用者堆栈。
import inspect
from django.db import models
from django.db.models import Manager
class LogManager(Manager):
def get_queryset(self):
print inspect.stack() # in py3.4 the [2] element was the actual caller outside Manager so I used [2:]
return super(LogManager, self).get_queryset()
class Abc(models.Model):
objects = LogManager()
更新:对于所有小于 1.5 的 django 版本,你应该覆盖 get_query_set
:
class LogManager(Manager):
def get_query_set(self):
print inspect.stack()
return super(LogManager, self).get_query_set()
在 Django 中,我想在模型中获取 classes 的调用堆栈;随叫随到,并记录下来。 Django 模型使用 QuerySet API 来访问模型 class 的对象。
说,我们已经定义了模型 class Abc
,其他 django 应用程序使用 QuerySet API.
例如-
Abc.objects.filter()
Abc.objects.get()
等
每当通过 QuerySetAPI 调用特定模型 class Abc
时,我想添加回溯。
追溯是正确的方法吗?我应该用别的东西吗?
我在 Mac.Python 上使用 Python 2.7、Vegrant、Django 1.4.20
如果我没理解错的话,这就是我的解决方案。对 queryset api 的任何调用都会打印调用者堆栈。
import inspect
from django.db import models
from django.db.models import Manager
class LogManager(Manager):
def get_queryset(self):
print inspect.stack() # in py3.4 the [2] element was the actual caller outside Manager so I used [2:]
return super(LogManager, self).get_queryset()
class Abc(models.Model):
objects = LogManager()
更新:对于所有小于 1.5 的 django 版本,你应该覆盖 get_query_set
:
class LogManager(Manager):
def get_query_set(self):
print inspect.stack()
return super(LogManager, self).get_query_set()