【问题标题】:get call stack for Model Classes in Django在 Django 中获取模型类的调用堆栈
【发布时间】:2015-07-27 18:30:24
【问题描述】:

在 Django 中,我想在模型中获取类的调用堆栈;随叫随到,并记录下来。 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。

【问题讨论】:

    标签: python django django-models models


    【解决方案1】:

    如果我理解正确,这就是我的解决方案。对 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.:对于所有 get_query_set:

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

    【讨论】:

    • Class LogManagerClass Abc 是否在同一个 Model.py 文件中?如果是这样,即使我有不同类的不同多个对象,这是否可行?
    • @malhar 现在它们在一个models.py 文件中。您想将此LogManager 用于不同的型号吗?它会起作用的。您可以将其移动到混凝土 models.py 文件之外的某个位置,并在您想要的任何模型中使用它。
    • 我明白了。 Abc的所有对象都会经过LogManager,然后执行queryset操作。但是,奇怪的是,我无法获得堆栈。这意味着 LogManager 没有被调用。知道为什么LogManager get_queryset 没有被调用,尽管这样做了?
    • @malhar 我现在明白了。尝试覆盖get_query_set 而不是我的,因为您使用的是旧的django,该方法称为get_query_set。更新了答案。
    • @malhar,您应该在模型的save 方法中使用它或使用其中一个信号,即post_savedocs.djangoproject.com/en/1.4/ref/signals/…
    猜你喜欢
    • 2011-05-03
    • 2020-08-24
    • 1970-01-01
    • 2014-07-22
    • 2017-09-16
    • 2011-10-10
    • 2011-11-21
    • 2014-04-26
    • 1970-01-01
    相关资源
    最近更新 更多