Два родительских класса для сериализатора имеют свою реализацию метода
я написал миксины для сериализаторов и столкнулся со следующей проблемой:
class UniqueLinkInspectionMixin(serializers.Serializer, ABC):
"""
Класс, отвечающий за валидацию пришедших uidb и токена в представлении,
в котором он используется.
"""
uidb = serializers.CharField()
token = serializers.CharField()
def __init__(self, *args, **kwargs):
"""
Конструктор, определяющий поле для валидации.
"""
self.token_generator = default_token_generator
super().__init__(*args, **kwargs)
@staticmethod
def get_customer(uidb):
"""
Метод, осуществляющий получение пользователя
по пришедшему uidb.
"""
try:
uid = urlsafe_base64_decode(uidb).decode()
return Customer.objects.get(pk=uid)
except (TypeError, ValueError, OverflowError, Customer.DoesNotExist):
pass
def validate(self, attrs):
"""
Валидирует пришедшие данные.
"""
uidb, token = attrs['uidb'], attrs['token']
customer = self.get_customer(uidb)
if not (
customer is not None
and self.token_generator(customer, token)
):
raise serializers.ValidationError(
'As a result of checking the link, '
'it turned out to be incorrect or inactive.'
)
class DoublePasswordMixin(serializers.Serializer, ABC):
"""
Сериализатор, от которого должны наследоваться другие сериализаторы,
ожидающие два парольных поля, которые объявлены здесь.
"""
password = PasswordField()
confirm_password = PasswordField()
def validate(self, attrs):
"""
Метод, который осуществляет проверку на соответствие
двух введенных паролей.
"""
if attrs['password'] != attrs.pop('confirm_password'):
raise serializers.ValidationError('Password mismatch.')
Как можно заметить, каждый из них имеет свою реализацию метода validate. Так вот скажем я напишу сериализатор для восстановления пароля и унаследую его от этих двух миксинов одновременно, один, который будет содержать логику валидации пришедшей уникальной ссылки, а другой тот, который валидирует пароль, первый в списке классов, от которых я буду наследоваться заменит второй. Помогите, мне, пожалуйста, с этой проблемой.
Ответы (1 шт):
Автор решения: Tr1nks
→ Ссылка
Добавте явный вызов метода из необходимого класса (Похожий вопрос)
from abc import ABC
class A(ABC):
def foo(self):
print('foo from A')
class B(ABC):
def foo(self):
print('B\'s foo')
class C(A,B):
pass
class D(B,A):
pass
class E(B,A):
def foo(self):
A.foo(self)
C().foo() # foo from A
D().foo() # B's foo
E().foo() # foo from A
Примерная заготовка для сериализатора:
class MySerializer(UniqueLinkInspectionMixin,DoublePasswordMixin):
def validate(self, attrs):
DoublePasswordMixin.validate(self,attrs)