drf_ujson2
drf_ujson2 copied to clipboard
TypeError thrown when serializing UUIDField
Issue rendering UUID field as foreign key
- TypeError encountered when serializing certain models
- Category objects could be rendered successfully
-
Photo
objects throw TypeError when using UJSONRenderer - JSONRenderer works fine
Output from shell
>>> p = Photo.objects.all()[0]
>>> p
<Photo: LE123: Photo_L*>
>>> s = PhotoSerializer(p)
>>> s.data
{'id': 4875, 'name': 'LE123 Photo_L.jpg', 'image': '/images/LE123_Photo_L.jpg', 'product': UUID('ffdce82f-f094-499a-b221-2b49ec9c36ff')}
>>> UJSONRenderer().render(s.data)
Traceback (most recent call last):
File "<console>", line 1, in <module>
File "/usr/local/lib/python3.6/site-packages/drf_ujson/renderers.py", line 42, in render
indent=indent or 0,
TypeError: �1a-� is not JSON serializable
>>> from rest_framework.renderers import JSONRenderer
>>> JSONRenderer().render(s.data)
b'{"id":4875,"name":"LE123 Photo_L.jpg","image":"/images/LE123_Photo_L.jpg","product":"ffdce82f-f094-499a-b221-2b49ec9c36ff"}'
Models & Serializers
class Category(OrderedModel):
category = models.CharField(max_length=50)
order = models.PositiveIntegerField(_("order"), editable=False, db_index=True)
class Product(models.Model):
id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
...
category = models.ManyToManyField(Category)
class Photo(models.Model):
name = models.CharField(max_length=500, null=True)
image = models.ImageField(null=True)
product = models.ForeignKey(Product, on_delete=models.SET_NULL, null=True)
class PhotoSerializer(serializers.ModelSerializer):
class Meta:
model = Photo
fields = "__all__"
class ProdSerializer(serializers.ModelSerializer):
category = serializers.StringRelatedField(many=True)
photo_set = PhotoSerializer(many=True)
class Meta:
model = Product
fields = "__all__"
class CategorySerializer(serializers.ModelSerializer):
class Meta:
model = Category
fields = "__all__"
- Suspect it might be due to the UUID reference in the
Photo
object? - Any suggestions on how to resolve this would be great