Как использовать множественное наследование в Django Rest Framework

У меня есть два сериализатора, которые идентичны, за исключением их родительского класса. Один наследуется от DRF's serailizers.Serializer. Другой наследуется от класса HalModelSerializer из пакета drf_hal_json.

class BriefcaseSerializer(HalModelSerializer):
    contexts = BriefcaseContextLinkSerializer(many=True, required=False)
    username = serializers.CharField(write_only=True)
    class Meta:
        model = Briefcase 
        fields = (
            'contexts',
            'username',
            )


class SimpleBriefcaseSerializer(serializers.Serializer):
    contexts = BriefcaseContextLinkSerializer(many=True, required=False)
    username = serializers.CharField(write_only=True)
    class Meta:
        model = Briefcase 
        fields = (
            'contexts',
            'username',
            )

В моем views.py я переопределил метод get_serializer_class для выбора одного из этих двух сериализаторов в зависимости от заголовка Accept в запросе.

Вводить оба класса полностью - плохо по очевидным причинам. Например, если я изменю один из них и забуду изменить другой.

Моя попытка исправить это заключалась в использовании множественного наследования. Это первый раз, когда я пытался использовать множественное наследование. Попытка:

class BriefcaseMixin:
    contexts = BriefcaseContextLinkSerializer(many=True, required=False)
    username = serializers.CharField(write_only=True)
    class Meta:
        model = Briefcase 
        fields = (
            'contexts',
            'username',
            )


class BriefcaseSerializer(HalModelSerializer, BriefcaseMixin):
    pass


class SimpleBriefcaseSerializer(serializers.Serializer, BriefcaseMixin):
    pass

Это не сработало. GET-запросы теперь выдают ошибку с

django.core.exceptions.ImproperlyConfigured: Field name `username` is not valid for model `Briefcase`.

Обратите внимание, что у меня был пользовательский метод создания для POST, который использовал имя пользователя. Я просто сократил его для минимального воспроизводимого примера.

Итак, есть идеи, как заменить первый блок кода в этом вопросе на что-то, что не повторяется?

Вернуться на верх