在Django中获取Model Classes的调用堆栈

时间:2015-05-15 18:12:38

标签: python django django-models models

在Django中,我想在Model中调用类的调用栈;随叫随到,记录下来。 Django模型使用 QuerySet API 来访问Model类的对象。

比如说,我们已经定义了模型class Abc,并且其他django应用程序使用 QuerySet API 调用它。

例如 -

Abc.objects.filter()

Abc.objects.get()

,等等。

我希望在通过 QuerySetAPI 调用特定模型class Abc时添加回溯。

追溯是一种正确的方法吗?我应该用别的吗?

我在Mac上使用Python 2.7,Vegrant,Django 1.4.20。

1 个答案:

答案 0 :(得分:2)

如果我理解你,这是我的解决方案。对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()

UPD。:适用于所有django版本< 1.5你应该覆盖get_query_set

class LogManager(Manager):
    def get_query_set(self):
        print inspect.stack()
        return super(LogManager, self).get_query_set()