Как получить экземпляр модели, вызывая миксин?
Я помещаю метод form_valid() в миксин следующим образом...
''' class PaymentAtomicMixin(object):
@transaction.atomic
def form_valid(self, form):
try:
with transaction.atomic():
self.instance = form.save(commit=False)
....
....
form.instance.user = self.request.user
return super().form_valid(form)
'''
3 модели подклассифицируют/используют этот миксин, и мне придется выполнять различные действия в зависимости от того, какая модель выполняет метод form_save(). Как я узнаю, какая модель и экземпляр модели использует этот миксин? (Django 3.2.7, Python 3.9.5)
Как вам уже намекнул @BrianD: это очень плохой антипаттерн, и вам, вероятно, не стоит этого делать. Если вам интересно, как это сделать в теории из любопытства, вот пример. Ключ в том, чтобы использовать isinstance()
.
class MyMixin:
prefix: str
def show_prefix(self):
if isinstance(self, A):
print(f'Prefix of {self.__class__.__name__} is {self.prefix}')
elif isinstance(self, B):
print(f'Prefix of {self.__class__.__name__} is {self.prefix}')
elif isinstance(self, C):
print(f'Prefix of {self.__class__.__name__} is {self.prefix}')
else:
raise AssertionError(f'Class {self.__class__.__name__} is not allowed to use MyMixin')
class A(MyMixin):
prefix = 'AAA'
class B(MyMixin):
prefix = 'BBB'
class C(MyMixin):
prefix = 'CCC'
A().show_prefix()
B().show_prefix()
C().show_prefix()
EDIT
Прочитав ваш ответ и лучше поняв, чего вы хотите добиться, я бы рассмотрел следующий код.
from enum import Enum
class MyMixinPrefix(Enum):
a = 'AAA'
b = 'BBB'
class MyMixin:
prefix: MyMixinPrefix
def show_prefix(self):
if self.prefix == MyMixinPrefix.a:
print(f'Do A logic')
elif self.prefix == MyMixinPrefix.b:
print(f'Do B logic')
else:
raise AssertionError(f'Unknown prefix')
class A(MyMixin):
prefix = MyMixinPrefix.a
class B(MyMixin):
prefix = MyMixinPrefix.b
class C(MyMixin):
prefix = MyMixinPrefix.a
A().show_prefix()
B().show_prefix()
C().show_prefix()