0

Ich habe einige Probleme mit Django REST Framework-Serialisierer (ja, ich bin ein Django noob). Insbesondere nach zum serializer.is_valid() -Aufruf, bekommen einige Daten 'verloren':Django REST Framework - serializer.is_valid() Daten verlieren

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 

Hier ist die Ausgabe:

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())]) 

Insbesondere sind das Feld artistImage und albumImage leer OrderedDict. Hier sind die Serializer:

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') 

Darüber hinaus habe ich bemerkt, dass, wenn ich den Serializer Druck zu entfernen, bevor es die Validierung, ich erhalte eine Fehlermeldung:

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. 

Antwort

1

können Sie versuchen, zu ersetzen

fields = ('url') 

mit

fields = ('url',) 

Die Klammern machen nicht automatisch Tupel. Sie müssen nach der Zeichenfolge ein Komma hinzufügen, um Python anzuzeigen, dass es sich um ein Tupel handeln soll.

Vom 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.