【问题标题】:Send a list in POST requisition - Django Rest Framework在 POST 申请中发送列表 - Django Rest Framework
【发布时间】:2021-10-12 13:34:51
【问题描述】:

我尝试在 Django Rest Framework 的 POST 申请中发送列表。我的目标是这样的:Nested Relationship,但我想要一个列表。

我需要什么:

{
     "id": 3435,
     "titulo": "Livro x",
     "editora": "Editora x",
     "foto": "https://i.imgur.com/imagem.jpg",
     "autores": ["Autor 1"]
}

我得到了什么:

{
  "autores": [
    {
      "non_field_errors": [
        "Invalid data. Expected a dictionary, but got str."
      ]
    }
  ]
}

我的 serializers.py 文件:

from rest_framework.serializers import ModelSerializer

from .models import Autor, Livro

class AutorSerializer(ModelSerializer):

    class Meta:
        model = Autor
        fields = ('nome')


class LivroSerializer(ModelSerializer):

    autores = AutorSerializer(many=True)

    class Meta:
        model = Livro
        fields = ('id', 'titulo', 'editora', 'autores')

    def create_autores(self, autores, livro):
        for autor in autores:
            obj = Autor.objects.create(**autor)
            livro.autores.add(obj)

    def create(self, validated_data, **kwargs):
        autores = validated_data.pop('autores')

        livro = Livro.objects.create(**validated_data)
        self.create_autores(autores, livro)

        return livro

我哪里出错了?

【问题讨论】:

  • 我试过了。不要工作。我有一个多对多的关系。但是,谢谢。
  • 如果你把这个autores = AutorSerializer(many=True)改成这个autores = AutorSerializer(many=True, read_only=True)会发生什么?
  • @Daniel,与autores = AutorSerializer(many=True, read_only=True),我收到Key error 'autores'

标签: django api django-rest-framework


【解决方案1】:

在您的views.py 中,如果需要更新,请为相应的视图添加以下创建代码。

class AutorViewset(viewsets.ModelViewSet):
    queryset=Autor.objects.all()
    serializer_class=AutorSerializer

    def create(self, request, *args, **kwargs):
        serializer = self.get_serializer(data=request.data, 
              many=isinstance(request.data,list))
        serializer.is_valid(raise_exception=True)
        self.perform_create(serializer)
        headers = self.get_success_headers(serializer.data)
        return Response(serializer.data, status=status.HTTP_201_CREATED, 
            headers=headers)

这将允许您将列表作为输入传递给 Autor 模型

【讨论】:

    猜你喜欢
    • 2014-06-02
    • 2020-11-23
    • 2023-01-08
    • 2015-06-28
    • 1970-01-01
    • 2021-01-05
    • 2021-08-31
    • 1970-01-01
    • 2019-05-18
    相关资源
    最近更新 更多