【发布时间】: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