0

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'
    
Waleed Baig
  • 422
  • 1
  • 6
  • 16

0 Answers0