Почему я получаю ошибку при добавлении метода __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. Я бы посоветовал вам более внимательно прочитать документацию, прежде чем продолжать работу над этим вашим проектом.