I am facing this error "TypeError: save() missing 1 required positional argument: 'self'" while posting variant to variantgroup using following URL: ../api/v1/variantgroup/1/variant/
Following is my code:
Viewsets.py
from django.shortcuts import get_object_or_404
from rest_framework.decorators import action
from rest_framework import viewsets
from rest_framework.response import Response
from products.models import VariantGroup, Variant
from products.api.v1.serializers import VariantGroupSerializer, VariantSerializer
class VariantGroupViewSet(viewsets.ModelViewSet):
queryset = VariantGroup.objects.all()
serializer_class = VariantGroupSerializer
lookup_field = 'id'
@action(detail=True, methods=['Get'])
def variants(self, request, id=None):
variantGroup = get_object_or_404(VariantGroup, pk=id)
variants = Variant.objects.filter(variantGroup= variantGroup)
serializer = VariantSerializer(variants, many = True)
return Response(serializer.data, status = 200)
@action(detail=True, methods=['Post'])
def variant(self, request, id=None):
variantGroup = get_object_or_404(VariantGroup, pk=id)
data= request.data
data["variantGroup"] = variantGroup.id
serializer= VariantSerializer(data=data)
if serializer.is_valid():
serializer.save()
return Response(serializer.data, status=200)
return Response(serializer.data, status = 400)
Models.py
class VariantGroup(models.Model):
name = models.CharField(verbose_name='Variant Group', max_length=100)
status = models.SmallIntegerField(default= 1)
buttonShape = models.SmallIntegerField()
isColorFilled = models.BooleanField(default=False)
class Variant(models.Model):
name = models.CharField(verbose_name='Variant', max_length=100)
displayName = models.CharField(verbose_name='Display Name', max_length=10)
status = models.SmallIntegerField(default= 1)
hexCode = models.CharField(verbose_name='Hex Code', max_length=20, null= True, blank=True)
variantGroup = models.ForeignKey(VariantGroup, on_delete= models.PROTECT)
EDIT 1:
The above gave me the error of Immutable QuerySet which i fixed by following changes
def variant(self, request, id=None):
variantGroup = get_object_or_404(VariantGroup, pk=id)
data= request.data
_mutable = data._mutable
# set to mutable
data._mutable = True
data["variantGroup"] = variantGroup.id
serializer= VariantSerializer(Variant, data=data)
data._mutable = _mutable
if serializer.is_valid():
serializer.save()
return Response(serializer.data, status=200)
return Response(serializer.data, status = 400)
But now i am facing another issue at serializer.save() line TypeError: save() missing 1 required positional argument: 'self'
Full stack is as follow:
Internal Server Error: /products/api/v1/variantgroup/1/variant/
Traceback (most recent call last):
File "/usr/lib/python3/dist-packages/django/core/handlers/exception.py", line 34, in inner
response = get_response(request)
File "/usr/lib/python3/dist-packages/django/core/handlers/base.py", line 115, in _get_response
response = self.process_exception_by_middleware(e, request)
File "/usr/lib/python3/dist-packages/django/core/handlers/base.py", line 113, in _get_response
response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "/usr/lib/python3/dist-packages/django/views/decorators/csrf.py", line 54, in wrapped_view
return view_func(*args, **kwargs)
File "/home/waleed/.local/lib/python3.8/site-packages/rest_framework/viewsets.py", line 114, in view
return self.dispatch(request, *args, **kwargs)
File "/home/waleed/.local/lib/python3.8/site-packages/rest_framework/views.py", line 505, in dispatch
response = self.handle_exception(exc)
File "/home/waleed/.local/lib/python3.8/site-packages/rest_framework/views.py", line 465, in handle_exception
self.raise_uncaught_exception(exc)
File "/home/waleed/.local/lib/python3.8/site-packages/rest_framework/views.py", line 476, in raise_uncaught_exception
raise exc
File "/home/waleed/.local/lib/python3.8/site-packages/rest_framework/views.py", line 502, in dispatch
response = handler(request, *args, **kwargs)
File "/home/waleed/retailry/retailry/products/api/v1/viewsets.py", line 31, in variant
serializer.save()
File "/home/waleed/.local/lib/python3.8/site-packages/rest_framework/serializers.py", line 207, in save
self.instance = self.update(self.instance, validated_data)
File "/home/waleed/.local/lib/python3.8/site-packages/rest_framework/serializers.py", line 992, in update
instance.save()
TypeError: save() missing 1 required positional argument: 'self'