有没有办法将 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):
    ...