Как в Python можно перезаписать атрибут class унаследованного класса, если этот атрибут сам является экземпляром модели?

Как указано в заголовке, у меня есть базовый класс ListView с атрибутом Serializer, который нужно перезаписать. Для каждой из моих django моделей я создаю дочерний класс ListView и Serializer. Так, например, для модели django Event у нас есть соответствующий класс представления EventListView(ListView), и у нас есть соответствующий класс Serializer EventSerializer(Serializer).

Дочерний класс Serializer указан внутри ListViewClass, как в моем коде ниже. Можно ли сделать так, чтобы сериализатор перезаписывался автоматически на основе значения, передаваемого в model, и как я могу отметить model и Serializer как атрибуты, которые будут перезаписываться и поэтому не нуждаются в значениях, указанных в базовом классе?

class EventSerializer(serializers.ModelSerializer):
    class Meta:
        model = Event
        fields = '__all__'

class ListView(APIView):
    model = <Model to be overwritten>        # Event is set as the default.
    Serializer = <Model Serializer to be overwritten>
    
    queryset = model.objects.all()

    def get(self,request):    
        # !!! Get filter conditions from request
        queryset = ListView.queryset.filter()    # !!! Filter conditions
        serializer = ListView.Serializer(queryset,many=True)
        return Response(serializer.data)

    def post(self,request):
        data = JSONParser.parse(request)
        serializer = ListView.Serializer(data = data)
        if serializer.is_valid():
            return Response(serializer.data, status = 201)
        else:
            return Response(serializer.errors, status = 400)


class EventListView(ListView):
    model = Event

Я думаю, что вам нужно использовать self.queryset, self.model и self.Serializer вместо ListView.queryset и ListView.Serializer. Тогда в каждом подклассе будет использоваться кверисет, модель и сериализатор подкласса, а не базы ListView.

В каждом подклассе необходимо переопределить model, queryset и Serializer.

class ListView(APIView):
    model = <Model to be overwritten>        # Event is set as the default.
    Serializer = <Model Serializer to be overwritten>
    
    queryset = model.objects.all()

    def get(self,request):    
        # !!! Get filter conditions from request
        queryset = self.queryset.filter()    # !!! Filter conditions
        serializer = self.Serializer(queryset,many=True)
        return Response(serializer.data)

    def post(self,request):
        data = JSONParser.parse(request)
        serializer = self.Serializer(data = data)
        if serializer.is_valid():
            return Response(serializer.data, status = 201)
        else:
            return Response(serializer.errors, status = 400)


class EventListView(ListView):
    model = Event
    Serializer = EventSerializer
    queryset = Event.objects.all()

Если вы не хотите определять queryset во всех подклассах, вы, вероятно, захотите добавить метод для получения набора запросов, используя модель, как это

class ListView(APIView):
    model = <Model to be overwritten>        # Event is set as the default.
    Serializer = <Model Serializer to be overwritten>
    

    def get_queryset():
        return self.model.objects.all()

    def get(self,request):    
        # !!! Get filter conditions from request
        queryset = self.get_queryset().filter()    # !!! Filter conditions
        serializer = self.Serializer(queryset,many=True)
        return Response(serializer.data)

    def post(self,request):
        data = JSONParser.parse(request)
        serializer = self.Serializer(data = data)
        if serializer.is_valid():
            return Response(serializer.data, status = 201)
        else:
            return Response(serializer.errors, status = 400)

На самом деле, многое из этого реализовано непосредственно в DRF, что избавит вас от необходимости кодирования. Посмотрите GenericAPIView (https://www.django-rest-framework.org/api-guide/generic-views/#genericapiview) и ListAPIView (https://www.django-rest-framework.org/api-guide/generic-views/#listapiview)

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