django rest framework serialize a dictionary without create a model
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
.
.data
will give you value of PrimaryKeyRelatedField by calling.to_representation()
method..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'sto_internal_value()
method and that value is used for validation process.
wgf4242
Updated on June 19, 2022Comments
-
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'