有没有办法将 class 中的所有方法设置为 Django 中的原子事务?
Is there any way to set all methods in a class as being in an atomic transaction in Django?
在Django中使用ViewSet的自定义action方法时,我将一些业务逻辑分离到另一个class,名称为BusinessService
。
BusinessService
class 可以从很多其他方法中使用,经过一些分析,我发现 class 中的所有方法(超过 5 个)都应该在 原子事务.
所以最简单但重复的方法可能是在方法名称上方添加 @transaction.atomic
装饰器,但作为遵循 the DRY principle 的方法,我一直在努力删除多余的重复,但无法做个简单的方法吧。
有没有在原子交易中做一个整体class?
到目前为止,我尝试在 class 的名称上方附加 @transaction.atomic
,但是当然没有成功,所以我分析了装饰器,发现了 Atomic
class 使用 __enter__
和 __exit__
进行事务管理,这需要 with
或其他东西。
您可以尝试使用自定义元 class(请参阅 What are metaclasses in Python?),它将修饰创建的 class 的所有方法。它将类似于下面,(请注意,可能有一些区域可以改进此元 class):
from django.db import transaction
class AtomicTransactionMeta(type):
def __new__(cls, name, bases, dct):
for key, value in dct.items():
if not key.startswith('__') and callable(value):
# If a non-dunder method then decorate
dct[key] = transaction.atomic(value)
return super().__new__(cls, name, bases, dct)
class BusinessService(metaclass=AtomicTransactionMeta):
...
在Django中使用ViewSet的自定义action方法时,我将一些业务逻辑分离到另一个class,名称为BusinessService
。
BusinessService
class 可以从很多其他方法中使用,经过一些分析,我发现 class 中的所有方法(超过 5 个)都应该在 原子事务.
所以最简单但重复的方法可能是在方法名称上方添加 @transaction.atomic
装饰器,但作为遵循 the DRY principle 的方法,我一直在努力删除多余的重复,但无法做个简单的方法吧。
有没有在原子交易中做一个整体class?
到目前为止,我尝试在 class 的名称上方附加 @transaction.atomic
,但是当然没有成功,所以我分析了装饰器,发现了 Atomic
class 使用 __enter__
和 __exit__
进行事务管理,这需要 with
或其他东西。
您可以尝试使用自定义元 class(请参阅 What are metaclasses in Python?),它将修饰创建的 class 的所有方法。它将类似于下面,(请注意,可能有一些区域可以改进此元 class):
from django.db import transaction
class AtomicTransactionMeta(type):
def __new__(cls, name, bases, dct):
for key, value in dct.items():
if not key.startswith('__') and callable(value):
# If a non-dunder method then decorate
dct[key] = transaction.atomic(value)
return super().__new__(cls, name, bases, dct)
class BusinessService(metaclass=AtomicTransactionMeta):
...