【问题标题】:Django REST Framework - serializer.is_valid() lose dataDjango REST Framework - serializer.is_valid() 丢失数据
【发布时间】:2016-04-18 00:24:29
【问题描述】:

我在使用 Django REST Framework 序列化程序时遇到了一些问题(是的,我是 Django 菜鸟)。 特别是,在 serializer.is_valid() 调用之后,一些数据会“丢失”:

    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.

【问题讨论】:

    标签: python django serialization django-rest-framework django-serializer


    【解决方案1】:

    你可以换个试试吗

    fields = ('url')
    

    fields = ('url',)
    

    括号不会自动使它们成为元组。您必须在字符串后添加一个逗号,以向 python 表明它应该是一个元组。

    来自Docs

    一个特殊的问题是包含 0 或 1 的元组的构造 items:语法有一些额外的怪癖来适应这些。空的 元组由一对空括号构成;一个元组 一个项目是通过在一个带有逗号的值后面构造的(它不是 足以将单个值括在括号中)。丑,但是 有效。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-28
      • 2013-02-04
      • 1970-01-01
      • 2017-09-10
      • 2021-08-03
      • 2019-02-22
      相关资源
      最近更新 更多