我的 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()
既是静态方法又是原子方法。
这是正确的定义:
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
应该是最顶层(最外面)的装饰器。