Django REST Framework - serializer.is_valid() 丢失数据
Django REST Framework - serializer.is_valid() lose data
我在使用 Django REST Framework 序列化程序时遇到了一些问题(是的,我是 Django 菜鸟)。
特别是,在 serializer.is_valid() 调用之后,一些数据得到 '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
这是输出:
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())])
特别是字段artistImage和albumImage是空的OrderedDict。
以下是序列化程序:
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')
此外,我注意到如果我删除序列化器打印,在验证它之前,我会得到一个错误:
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.
你可以尝试更换
fields = ('url')
和
fields = ('url',)
括号不会自动使它们成为元组。您必须在字符串后添加一个逗号以指示 python 它应该是一个元组。
来自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.
我在使用 Django REST Framework 序列化程序时遇到了一些问题(是的,我是 Django 菜鸟)。 特别是,在 serializer.is_valid() 调用之后,一些数据得到 '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
这是输出:
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())])
特别是字段artistImage和albumImage是空的OrderedDict。 以下是序列化程序:
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')
此外,我注意到如果我删除序列化器打印,在验证它之前,我会得到一个错误:
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.
你可以尝试更换
fields = ('url')
和
fields = ('url',)
括号不会自动使它们成为元组。您必须在字符串后添加一个逗号以指示 python 它应该是一个元组。
来自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.