djongo icon indicating copy to clipboard operation
djongo copied to clipboard

getting error related to arrayfield

Open karthik233 opened this issue 4 years ago • 1 comments

when trying to access serialized.data, throws error for type "models.ArrayField"

Python script

models:

class testStep(models.Model):
    number      = models.PositiveSmallIntegerField(max_length=100)
    payload     = models.JSONField(blank=True)
    header      = models.JSONField(blank=False)
    assertors   = models.EmbeddedField(model_container=assertStep, blank=True)
    dateCreated = models.DateTimeField(auto_now_add=True)
    dateUpdated = models.DateTimeField(auto_now=True)
    
    class Meta:
        abstract = True

class test(models.Model):
    _id       = models.ObjectIdField(primary_key=True)
    appId  = models.ForeignKey(application, on_delete=models.PROTECT)
    name  = models.TextField(blank=False, unique=True)
    step    = models.ArrayField(model_container=step, blank=True, default=list)
    dateCreated = models.DateTimeField(auto_now_add=True)
    dateUpdated = models.DateTimeField(auto_now=True)

serializers:

class testStepSerializer(serializers.ModelSerializer):
class Meta:
        model            = models.testCase
        fields           = '__all__'
        read_only_fields = ['dateCreated', 'dateUpdated', ]

def update(self, instance, validated_data):
        instance.testStep    = validated_data.get('testStep', instance.testStep)
        instance.save()
        return instance

views.py

def put(self, request, testCaseId, format=None):
        tcDetails         = self.getTcDetails(testCaseId)
        reqData           = request.data.copy()        
        reqData['number'] = len(tcDetails.testStep) + 1
        reqData['name']   = tcDetails.name
        serialized        = serialize.testStepSerializer(tcDetails, data=reqData)
        
        if serialized.is_valid():
                 serialized.save()
                 return Response(json.loads(json_util.dumps(serialized.data)), status=status.HTTP_200_OK)
      return JsonResponse(serialized.errors, status=400)

Traceback

serialized.data -- Traceback (most recent call last): File "", line 1, in File "C:\Users\XYZ\AppData\Local\Programs\Python\Python37-32\lib\site-packages\rest_framework\serializers.py", line 548, in data ret = super().data File "C:\Users\XYZ\AppData\Local\Programs\Python\Python37-32\lib\site-packages\rest_framework\serializers.py", line 246, in data self._data = self.to_representation(self.instance) File "C:\Users\XYZ\AppData\Local\Programs\Python\Python37-32\lib\site-packages\rest_framework\serializers.py", line 515, in to_representation ret[field.field_name] = field.to_representation(attribute) File "C:\Users\XYZ\AppData\Local\Programs\Python\Python37-32\lib\site-packages\rest_framework\fields.py", line 1922, in to_representation return self.model_field.value_to_string(obj) File "C:\Users\XYZ\AppData\Local\Programs\Python\Python37-32\lib\site-packages\djongo\models\fields.py", line 355, in value_to_string post_dict = self._obj_thru_fields('value_to_string', container_obj) File "C:\Users\XYZ\AppData\Local\Programs\Python\Python37-32\lib\site-packages\djongo\models\fields.py", line 177, in _obj_thru_fields processed_value[field.attname] = getattr(field, func_name)(obj, *other_args) File "C:\Users\XYZ\AppData\Local\Programs\Python\Python37-32\lib\site-packages\djongo\models\fields.py", line 201, in value_to_string raise TypeError(f'Type: {type(value)} cannot be serialized') TypeError: Type: <class 'NoneType'> cannot be serialized

karthik233 avatar Oct 05 '21 09:10 karthik233

Same issue. I added str to my abstract classes and now it is a validation error. Django admin says that my values must be an instance of <class 'list'> to my models. ArrayField and must be an instance of <class 'dict'> to my models.EmbeddedField

LuAlJaBe avatar Oct 28 '21 04:10 LuAlJaBe