Django rest framework DRF:序列化一对多

Django rest framework DRF:序列化一对多,django-rest-framework,Django Rest Framework,在序列化问题时尝试打印问题的所有答案,但在告诉django如何查找父项时遇到困难 目标是返回如下内容: [ { uuid: 1, question: 'Question 1', answers: [ {'uuid': 1, 'answer': "A"}, {'uuid': 2, 'answer': "B"}, {'uuid': 3, 'answer': "C"}, ], }, ] models.py class Que

在序列化问题时尝试打印问题的所有答案,但在告诉django如何查找父项时遇到困难

目标是返回如下内容:

[
  {
    uuid: 1,
    question: 'Question 1',
    answers: [
      {'uuid': 1, 'answer': "A"},
      {'uuid': 2, 'answer': "B"},
      {'uuid': 3, 'answer': "C"},
    ],
  },
]
models.py

class Question(models.Model):
    uuid = ShortUUIDField(unique=True, blank=False, editable=False, default=shortuuid.uuid())
    question = models.CharField(max_length=140)
    creator = models.ForeignKey(CustomUser, on_delete=models.CASCADE, blank=True, null=True)
    def __str__(self):
        return '{}'.format(self.question)
    class Meta:
        indexes = [
            models.Index(fields=['uuid']),
        ]

class Answer(models.Model):
    uuid = ShortUUIDField(unique=True, blank=False, editable=False, default=shortuuid.uuid())
    question = models.ForeignKey(Question, on_delete=models.CASCADE)
    answer = models.CharField(max_length=70)
    creator = models.ForeignKey(CustomUser, on_delete=models.CASCADE, blank=True, null=True)
    def __str__(self):
        return '{}'.format(self.answer)
    class Meta:
        indexes = [
            models.Index(fields=['uuid']),
        ]
序列化程序.py

class AnswerSerializer(serializers.ModelSerializer):
    creator = ProfileSerializer(read_only = True)
    class Meta:
        model = models.Answer
        fields = ('uuid','answer', 'creator','question')
class QuestionSerializer(serializers.ModelSerializer):
    creator = ProfileSerializer(read_only = True)
    question_answer = AnswerSerializer(many=True,source='id')
    class Meta:
        model = models.Question
        fields = ('uuid','question', 'creator', 'question_answer')
views.py

class QuestionViewSet(viewsets.ModelViewSet):
    queryset = models.Question.objects.all()
    serializer_class = serializers.QuestionSerializer
抛出错误

Traceback (most recent call last):
  File "\Backend\env\lib\site-packages\django\core\handlers\exception.py", line 34, in inner
    response = get_response(request)
  File "\Backend\env\lib\site-packages\django\core\handlers\base.py", line 115, in _get_response
    response = self.process_exception_by_middleware(e, request)
  File "\Backend\env\lib\site-packages\django\core\handlers\base.py", line 113, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "\Backend\env\lib\site-packages\django\views\decorators\csrf.py", line 54, in wrapped_view
    return view_func(*args, **kwargs)
  File "\Backend\env\lib\site-packages\rest_framework\viewsets.py", line 116, in view
    return self.dispatch(request, *args, **kwargs)
  File "\Backend\env\lib\site-packages\rest_framework\views.py", line 495, in dispatch
    response = self.handle_exception(exc)
  File "\Backend\env\lib\site-packages\rest_framework\views.py", line 455, in handle_exception
    self.raise_uncaught_exception(exc)
  File "\Backend\env\lib\site-packages\rest_framework\views.py", line 492, in dispatch
    response = handler(request, *args, **kwargs)
  File "\Backend\env\lib\site-packages\rest_framework\mixins.py", line 48, in list
    return Response(serializer.data)
  File "\Backend\env\lib\site-packages\rest_framework\serializers.py", line 768, in data
    ret = super(ListSerializer, self).data
  File "\Backend\env\lib\site-packages\rest_framework\serializers.py", line 262, in data
    self._data = self.to_representation(self.instance)
  File "\Backend\env\lib\site-packages\rest_framework\serializers.py", line 686, in to_representation
    self.child.to_representation(item) for item in iterable
  File "\Backend\env\lib\site-packages\rest_framework\serializers.py", line 686, in <listcomp>
    self.child.to_representation(item) for item in iterable
  File "\Backend\env\lib\site-packages\rest_framework\serializers.py", line 530, in to_representation
    ret[field.field_name] = field.to_representation(attribute)
  File "\Backend\env\lib\site-packages\rest_framework\serializers.py", line 686, in to_representation
    self.child.to_representation(item) for item in iterable
TypeError: 'int' object is not iterable
回溯(最近一次呼叫最后一次):
文件“\Backend\env\lib\site packages\django\core\handlers\exception.py”,第34行,在内部
响应=获取响应(请求)
文件“\Backend\env\lib\site packages\django\core\handlers\base.py”,第115行,在get\U响应中
response=self.process\u异常\u由\u中间件(e,请求)
文件“\Backend\env\lib\site packages\django\core\handlers\base.py”,第113行,在\u get\u响应中
响应=包装的回调(请求,*回调参数,**回调参数)
文件“\Backend\env\lib\site packages\django\views\decorators\csrf.py”,包装视图中的第54行
返回视图函数(*args,**kwargs)
文件“\Backend\env\lib\site packages\rest\u framework\viewsets.py”,第116行,在视图中
返回自调度(请求,*args,**kwargs)
文件“\Backend\env\lib\site packages\rest\u framework\views.py”,第495行,在分派中
响应=自身处理异常(exc)
文件“\Backend\env\lib\site packages\rest\u framework\views.py”,第455行,在handle\u异常中
自举未捕获异常(exc)
文件“\Backend\env\lib\site packages\rest\u framework\views.py”,第492行,在分派中
响应=处理程序(请求、*args、**kwargs)
列表中第48行的文件“\Backend\env\lib\site packages\rest\u framework\mixins.py”
返回响应(serializer.data)
数据中第768行的文件“\Backend\env\lib\site packages\rest\u framework\serializers.py”
ret=super(ListSerializer,self).data
数据中第262行的文件“\Backend\env\lib\site packages\rest\u framework\serializers.py”
self.\u data=self.to\u表示(self.instance)
文件“\Backend\env\lib\site packages\rest\u framework\serializers.py”,第686行,以to\u表示
iterable中项的self.child.to_表示(项)
文件“\Backend\env\lib\site packages\rest\u framework\serializers.py”,第686行,在
iterable中项的self.child.to_表示(项)
文件“\Backend\env\lib\site packages\rest\u framework\serializers.py”,第530行,以to\u表示
ret[field.field\u name]=field.to\u表示(属性)
文件“\Backend\env\lib\site packages\rest\u framework\serializers.py”,第686行,以to\u表示
iterable中项的self.child.to_表示(项)
TypeError:“int”对象不可编辑

我相信错误是由您在
问题序列化程序上使用
source='id'
引起的。问题\u答案
。使用
source='id'
意味着序列化程序将使用
问题上的
id
字段来检索答案

我建议您采取以下措施来解决此问题:

  • related\u name
    参数添加到
    Answer.question
    字段,例如
    question=models.ForeignKey(问题,on\u delete=models.CASCADE,related\u name='answers')

  • 更新序列化程序以使用反向关系的名称
    问题。回答字段上的


  • 我相信错误是由您在
    问题序列化程序上使用
    source='id'
    引起的。问题\u答案
    。使用
    source='id'
    意味着序列化程序将使用
    问题上的
    id
    字段来检索答案

    我建议您采取以下措施来解决此问题:

  • related\u name
    参数添加到
    Answer.question
    字段,例如
    question=models.ForeignKey(问题,on\u delete=models.CASCADE,related\u name='answers')

  • 更新序列化程序以使用反向关系的名称
    问题。回答字段上的


  • 您的帖子缺少一些代码片段,序列化程序部分。除此之外,请添加完整的错误tracenback和views.py抱歉,第一行在“``之后没有换行符,stackoverflow不知何故决定删除整个lineAdded views.py和error traceYour post缺少一些代码片段,序列化程序部分。除此之外,请添加完整的错误跟踪back和views.py抱歉,第一行在“``之后没有换行符,stackoverflow以某种方式决定删除整个lineAdded views.py和错误跟踪
        class QuestionSerializer(serializers.ModelSerializer):
            creator = ProfileSerializer(read_only = True)
            answers = AnswerSerializer(many=True, read_only=True)
            class Meta:
                model = models.Question
                fields = ('uuid','question', 'creator', 'answers')