Два родительских класса для сериализатора имеют свою реализацию метода

я написал миксины для сериализаторов и столкнулся со следующей проблемой:

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)
→ Ссылка