【问题标题】:Expected a list of items but got dict djangorestframework需要一个项目列表,但得到了 dict djangorestframework
【发布时间】:2021-03-20 00:06:09
【问题描述】:

我正在使用 DjangoRestFramework 和 ReactJS 制作一个测验应用程序,并且我正在为我的创建测验页面编写序列化程序。

在我的应用程序中,我有一个 Question 模型、一个作为测验的 Game 模型和一个 Option 模型。

问题

我的数据

这是我要反序列化的数据:


data = { 
'name': 'Quiz Name', 
'questions': {
  'text': 'Question 1', 
  'options':[
        {'text': 'option 1', 'is_correct':False},
        {'text': 'option 1', 'is_correct':True},
     ]
   }
 }

我在 shell 中运行它:

 >>> serializer = CreateGameSerializer(data=data)
 >>> serializer.is_valid()
 False
 >>> serializer.errors
 {'questions': {'non_field_errors': [ErrorDetail(string='Expected a list of items
 but got type "dict".', code='not_a_list')]}}

如您所见,我收到了Expected a list of items but got type "dict"。我不确定这个错误是什么意思,我搜索了 SO,但没有找到任何相关内容。

我的文件

我已经包含了一些模型和序列化程序来帮助解决问题。

models.py

​​>
class Game(models.Model):

  name = models.CharField(max_length=100, default='')
  code = models.CharField(max_length=100, default=generate_unique_code, unique=True)
  host = models.CharField(max_length=50, unique=True)

  def __str__(self):
    return self.code


class Question(models.Model):
  text = models.CharField(max_length=100)
  order = models.IntegerField(default=0)

  game = models.ForeignKey(Game, on_delete=models.CASCADE, related_name='questions')

  def __str__(self):
    return self.text

class Option(models.Model):
  text = models.CharField(max_length=100)
  is_correct = models.BooleanField(default=False)
  question = models.ForeignKey(Question, on_delete=models.CASCADE, related_name='options')
  def __str__(self):
    return self.text

serializers.py

​​>




class OptionSerializer(serializers.ModelSerializer):

    class Meta:
        model = Option
        fields = ('text', 'is_correct')



class CreateQuestionSerializer(serializers.ModelSerializer):
  options = OptionSerializer(many=True)
  class Meta:
    model = Question
    fields = ('text', 'order', 'options')

  def create(self, validated_data):
      options_data = validated_data.pop('options')
      print(options_data)

      question = Question.objects.create(**validated_data)
      for option_data in options_data:
          Option.objects.create(question=question, **option_data)




class CreateGameSerializer(serializers.ModelSerializer):
  questions = CreateQuestionSerializer(many=True)

  class Meta:
    model = Game
    fields = ('votes_to_skip', 'name', 'questions')

  def create(self, validated_data):
      questions_data = validated_data.pop('questions')
      print(questions_data)

      game = Game.objects.create(**validated_data)
      for question_data in questions_data:
          Question.objects.create(game=game, **question_data)
      return game


我想我已经提供了足够的信息。我是这个主题的新手,所以请耐心等待。谢谢!

【问题讨论】:

    标签: python json django django-models django-rest-framework


    【解决方案1】:

    线索在以下几行:

    class CreateGameSerializer(serializers.ModelSerializer):
      questions = CreateQuestionSerializer(many=True)
      # ...
    

    因为您设置了many=True,序列化程序需要一个对象列表,但您输入的是单个对象。根据您的情况,您有两种选择:设置many=False 并按原样使用您的数据,或者保留many=True 并将您的数据更改为:

    data = { 
    'name': 'Quiz Name', 
    'questions': [
      {
      'text': 'Question 1', 
      'options':[
            {'text': 'option 1', 'is_correct':False},
            {'text': 'option 1', 'is_correct':True},
         ]
       }
      ]
     }
    

    【讨论】:

    • 感谢您的帮助!事实证明,我希望测验有多个问题,但我犯了一个愚蠢的错误,忘记将问题放入包含字典的列表中。我不知道我怎么没看到错字。
    猜你喜欢
    • 2021-07-13
    • 1970-01-01
    • 1970-01-01
    • 2021-08-31
    • 2021-07-20
    • 1970-01-01
    • 2023-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多