django rest framework serialize a dictionary without create a model

10,252

What you want,can be achived by doing following changes.

class EavForm(models.Model):
    name = models.CharField(max_length=300)
    order = models.IntegerField(default=1)


# serializer
class EvaFormPKRelatedField(PrimaryKeyRelatedField):
    def get_queryset(self):
        return EavForm.objects.all()

    def to_representation(self, value):
        return value.name


class CustomSerializer(serializers.Serializer):
    form = EvaFormPKRelatedField()
    count = serializers.IntegerField()

# Assume EvaForm exist of id 1 and 2
data = [{'form': 1, 'count': 1}, {'form': 2, 'count': 1}]
s = CustomSerializer(data=data, many=True)
print(s.data) 
""" Output
[
  {'form': 'my form name 1', 'count': 1},
  {'form': 'my form name 2', 'count': 3}
]
"""

print(s.validated_data)
""" Output
[
  {'form': <EvaForm: Evaform object (1)>, 'count': 1},
  {'form': <EvaForm: Evaform object (2)>, 'count': 3}
]
"""

Please note that, there is changes in output of .data and .validated_data .

  1. .data will give you value of PrimaryKeyRelatedField by calling .to_representation() method.

  2. .validated_data will give you value of PrimaryKeyRelatedField by calling .to_internal_value() method. Because, validated data got it's value for each field by calling it's all validations, and internally before running validations each field value will be updated by calling it's to_internal_value() method and that value is used for validation process.

Share:
10,252
wgf4242
Author by

wgf4242

Updated on June 19, 2022

Comments

  • wgf4242
    wgf4242 almost 2 years

    My data is like this, I want to serialize them without creating model for them.

    [
      {'form': 1, 'count': 1},
      {'form': 2, 'count': 3}
    ]
    

    serilize to

    [
      {'form': 'my form name 1', 'count': 1},
      {'form': 'my form name 2', 'count': 3}
    ]
    

    I want to serialize it with serializer, get form name form model by pk.

    class EavForm(models.Model):
        name = models.CharField(max_length=300)
        order = models.IntegerField(default=1)
    
    
    # serializer
    class CustomSerializer(serializers.Serializer):
        form = serializers.PrimaryKeyRelatedField(queryset=EavForm.objects.all())
        count = serializers.IntegerField()
    

    Some error like 'int' object has no attribute 'pk'

    test in python control

    d = [{'form': 1, 'count': 1}, {'form': 2, 'count': 1}]
    s = CustomSerializer(d, many=True)
    print(s.data)
    
    # error
    Traceback (most recent call last):
      File "backend/src/db_tools/del1.py", line 25, in <module>
        print(s.data)
      File "backend/lib/python3.7/site-packages/rest_framework/serializers.py", line 768, in data
        ret = super(ListSerializer, self).data
      File "backend/lib/python3.7/site-packages/rest_framework/serializers.py", line 262, in data
        self._data = self.to_representation(self.instance)
      File "backend/lib/python3.7/site-packages/rest_framework/serializers.py", line 686, in to_representation
        self.child.to_representation(item) for item in iterable
      File "backend/lib/python3.7/site-packages/rest_framework/serializers.py", line 686, in <listcomp>
        self.child.to_representation(item) for item in iterable
      File "backend/lib/python3.7/site-packages/rest_framework/serializers.py", line 530, in to_representation
        ret[field.field_name] = field.to_representation(attribute)
      File "backend/lib/python3.7/site-packages/rest_framework/relations.py", line 272, in to_representation
        return value.pk
    AttributeError: 'int' object has no attribute 'pk'