0
votes

I'm having some issues with Django REST Framework serializers (yes, I'm a Django noob). In particular, following to the serializer.is_valid() call, some data get 'lost':

    serializer = ReviewSerializer(data=request.data, many=False)
    print serializer
    if not serializer.is_valid():
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
    print serializer.validated_data

Here is the output:

ReviewSerializer(data={u'album': {u'spotify_id': 1, u'name': u'TEXT'},
   u'rating': 1, u'artistImage': {u'url': u'ARTIST_URL'}, u'artist': 
  {u'genres': u'ROCK', u'spotify_id': 1, u'name': u'TEXT'}, 
   u'review': u'TEXT', u'albumImage': {u'url': u'ALBUM_URL'}}):

review = CharField(max_length=None)
rating = DecimalField(decimal_places=1, max_digits=2)
artist = ArtistSerializer():
    name = CharField(max_length=100)
    genres = CharField(max_length=100)
    spotify_id = CharField(max_length=50)
album = AlbumSerializer():
    name = CharField(max_length=100)
    spotify_id = CharField(max_length=50)
artistImage = ArtistImageSerializer()
albumImage = AlbumImageSerializer()


OrderedDict([(u'review', u'TEXT'), (u'rating', Decimal('1')), 
  (u'artist', OrderedDict([(u'name', u'TEXT'), (u'genres', u'ROCK'), 
  (u'spotify_id', u'1')])), (u'album', OrderedDict([(u'name', u'TEXT'), 
  (u'spotify_id', u'1')])), (u'artistImage', OrderedDict()),    
  (u'albumImage', OrderedDict())])

In particular, the field artistImage and albumImage are empty OrderedDict. Here are the serializers:

class ReviewSerializer(serializers.Serializer):

  review = serializers.CharField(max_length=None)
  rating = serializers.DecimalField(decimal_places=1, max_digits=2)
  artist = ArtistSerializer()
  album = AlbumSerializer()
  artistImage = ArtistImageSerializer()
  albumImage = AlbumImageSerializer()

class AlbumImageSerializer(serializers.ModelSerializer):

  class Meta:
    model = ArtistImage
    fields = ('url')

class ArtistImageSerializer(serializers.ModelSerializer):

  class Meta:
    model = ArtistImage
    fields = ('url')

In addition, I noticed that If I remove the serializer print, before validating it, I get an error:

    serializer = ReviewSerializer(data=request.data, many=False)
    if not serializer.is_valid():
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
    print serializer.validated_data

Traceback (most recent call last):
...
TypeError: The `fields` option must be a list or tuple or "__all__". Got str.
1

1 Answers

1
votes

Can you try replacing

fields = ('url')

with

fields = ('url',)

The parenthesis don't automatically make them tuples. You have to add a comma after the string to indicate to python that it should be a tuple.

From the Docs:

A special problem is the construction of tuples containing 0 or 1 items: the syntax has some extra quirks to accommodate these. Empty tuples are constructed by an empty pair of parentheses; a tuple with one item is constructed by following a value with a comma (it is not sufficient to enclose a single value in parentheses). Ugly, but effective.