Django 装饰器 @transaction_atomic 和 @static_method 互相干扰吗?

问题描述 投票:0回答:1

我的 Django 模型:

from django.db import models

class MyModel(models.Model):
    my_field1 = models.IntegerField()

    @staticmethod
    def my_method():
        return "XXXX"

如您所见,当我运行

my_method()
时,它起作用了:

>>> MyModel.my_method()
'XXXX'

但是然后我将装饰器

@transaction_atomic
添加到
my_method()

@transaction.atomic
@staticmethod
def my_method():
    return "XXXX"

现在,当我尝试做同样的事情时,它现在失败了:

>>> MyModel.my_method()
Traceback (most recent call last):
  File "<console>", line 1, in <module>
TypeError: __call__() takes exactly 2 arguments (1 given)

为什么?我应该如何修复它。 我希望

my_method()
既是静态方法又是原子方法。

python django static-methods atomic python-decorators
1个回答
0
投票

这是正确的定义:

from django.db import models

class MyModel(models.Model):
    my_field1 = models.IntegerField()

    @staticmethod
    @transaction.atomic
    def my_method():
        return "XXXX"

详情:

staticmethod
返回描述符对象而不是函数,而
transaction.atomic
(像大多数装饰器一样)需要一个函数。装饰器按 Button-Up 顺序应用,因此
staticmethod
应该是最顶层(最外面)的装饰器。

© www.soinside.com 2019 - 2024. All rights reserved.