Почему я получаю ошибку при добавлении метода __init__(self) в класс viewset фреймворка Django rest?

Я продолжаю получать ошибку при попытке создать Django API.

У меня есть этот класс:

from uuid import UUID
from django.shortcuts import render
from django.http.response import JsonResponse
from django.http.request import HttpRequest
from rest_framework import viewsets, status
from rest_framework.parsers import JSONParser
from rest_framework.response import Response
from Instruments import serializers
from Instruments.services import InstrumentsService
from rest_framework.decorators import api_view
from Instruments.services import InstrumentsService
from Instruments.models import Instrument
from Instruments.serializers import InstrumentsSerializer


# Application views live here
class InstrumentViewSet(viewsets.ViewSet):
    # instruments = Instrument.objects.all()

    def __init__(self):
        # self.instrument_service = InstrumentsService()
        # self.instruments = Instrument.objects.all()
        super().__init__()

    def list(self, request: HttpRequest):

        try:
            self.instruments = Instrument.objects.all()
            serializer = InstrumentsSerializer(self.instruments, many=True)
            # data = self.instrument_service.get_instruments()
            data = serializer.data
            return JsonResponse(data, status=status.HTTP_200_OK, safe=False)
        except Exception as exc:
            return JsonResponse(
                {"Status": f"Error: {exc}"},
                status=status.HTTP_400_BAD_REQUEST,
                safe=False,
            )

когда метод init() определяется, даже если он просто делает pass сервер django выдает мне эту ошибку, когда я отправляю запрос:

TypeError at /api/
__init__() got an unexpected keyword argument 'suffix'

Если я удалю или закомментирую метод init(), то он работает. Почему?

Исключение "получен неожиданный аргумент ключевого слова" довольно описательно. Оно означает, что экземпляр вашего класса (в данном случае экземпляр ViewSet) был инициализирован с аргументом ключевого слова, который вы не обрабатываете. Это можно исправить, сделав следующее в методе init:

def __init__(self, **kwargs):
    # self.instrument_service = InstrumentsService()
    # self.instruments = Instrument.objects.all()
    super().__init__(**kwargs)

Это необходимо, поскольку суперкласс (View) использует **kwargs при инициализации экземпляра.

Для справки, это не использование Django так, как он был задуман. Django никогда не предназначался для сервисных слоев, и использование метода init подобным образом контрпродуктивно, поскольку ViewSet принимает переменную queryset. Я бы посоветовал вам более внимательно прочитать документацию, прежде чем продолжать работу над этим вашим проектом.

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