我可以在Django中为模型方法创建自定义装饰器吗?

时间:2018-08-15 03:13:10

标签: python django model decorator

假设我有以下模型-

RewriteRule ^category/([0-9a-zA-Z-]+)/page/([0-9a-zA-Z_-]+) category.php?cat=$1&pagi=$2 [NC,L]

现在,我想添加一个记录器,只要该方法成功地开始和结束到此class Banana(models.Model): name = models.CharField(max_length=255) def get_banana(self): return f'Banana: {self.name}' 方法,该记录器就会生成日志。

记录器如下-

get_banana

所以我创建了一个记录器装饰器-

class Log(models.Model):
    type = models.CharField(max_length=255)
    message = models.CharField(max_length=255)

    content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE)
    object_id = models.PositiveIntegerField()
    content_object = GenericForeignKey()

如何将此装饰器添加到我的def log_status(f): def wrapper(**fields): Log.objects.create(**{k: (v if k != 'message' else v + ':STARTED') for k, v in fields.items()}) return_value = f() Log.objects.create(**{k: (v if k != 'message' else v + ':COMPLETED') for k, v in fields.items()}) return return_value return wrapper 方法中?

以下内容不起作用,因为它看不到get_banana

self

1 个答案:

答案 0 :(得分:0)

由于您正在装饰一种方法,因此self实际上可供装饰器使用。它在解析时将不可用,但肯定会在运行时可用。您需要做的就是像这样更改装饰器:

def log_status(function):
    def wrapper(self, *args, **kwargs):
        return_value = function(self, *args, **kwargs) # do whatever you want here
        return return_value
    return wrapper

仅此而已。现在,在运行时,装饰器可以使用self并将其传递给装饰器,并且您的函数应按预期执行。