首页 > 解决方案 > Django Rest Framework 创建多个对象

问题描述

这就是我到目前为止所拥有的。

我的序列化器:

class MySerializer(serializers.ModelSerializer):

     class Meta:
         model = MyModel
         fields = ('field_1', 'field_2', 'field_3')

我的模型视图集

class MyViewSet(ModelViewSet):

    serializer_class = MySerializer
    model = MyModel
    queryset = MyModel.objects.all().order_by('date_paid')

    def create(self, request, *args, **kwargs):
        many = True if isinstance(request.data, list) else False
        serializer = MySerializer(data=request.data, many=many)
        if serializer.is_valid():
            serializer.save()
        else:
            return Response(serializer.errors, 
status=status.HTTP_400_BAD_REQUEST)
        return Response(serializer.data, status=status.HTTP_201_CREATED)

我主要担心的是,在测试端点以使用以下有效负载创建多个对象时,在视图上该属性request.data似乎为空,因此它返回字段缺失的错误。

{
        'data': [
            {
                'type': 'MySerializer',
                'attributes': {
                    'field_1': 1,
                    'field_2': 0.05,
                    'field_3': 'abc'
                }
            },
            {
                'type': 'MySerializer',
                'attributes': {
                    'field_1': 1,
                    'field_2': 0.05,
                    'field_3': 'abc'
                }
            },
            {
                'type': 'MySerializer',
                'attributes': {
                    'field_1': 1,
                    'field_2': 0.05,
                    'field_3': 'abc'
                }
            }
        ]
    }

但是,当使用单个对象实例时:

{
        'data': {
            'type': 'MySerializer',
            'attributes': {
                    'field_1': 1,
                    'field_2': 0.05,
                    'field_3': 'abc'
            }
        }
    }

它似乎工作得很好,并且创建了对象。

我尝试了几种方法来容纳有效负载:

我应该如何为多个对象发送数据,甚至可能吗,我在许多文章中读到仅通过放置many=True在序列化程序实例上就足以完成此任务,但我无法从请求中获取数据。

我错过了任何步骤或其他解决方法?

编辑

忘了说两件事

  1. 我正在使用django rest framework json api库,这可能是数据为空的原因吗?
  2. 因为我正在测试端点并且我在发送数据时使用 json.dumps(payload) ,所以我放置了字典。

标签: djangodjango-rest-framework

解决方案


好的,我对创建单个对象实例的工作感到惊讶,因为数据似乎格式不正确。使用many参数时,序列化程序需要一个列表,但您发送的是一个 json 对象。

这就是 JSON 应该的样子:

    [
        {

              "field_1": 1,
              "field_2": 0.05,
              "field_3': "abc"

        },
        {

              "field_1": 1,
              "field_2": 0.05,
              "field_3': "abc"

        },
        {

              "field_1": 1,
              "field_2": 0.05,
              "field_3': "abc"

        }
    ]

这些是这里需要注意的点:

  1. JSON 以列表开头
  2. 字段直接在每个对象的主体中 - 没有typeattribute字段,希望您实现逻辑以在序列化程序中解析它
  3. JSON 不使用单引号,而是使用双引号

您是否request.data按照您所说的那样检查以确认它是空的?如果是这样,那么这完全是另一个问题,因为它可能是解析问题。

编辑:使用 JSON API

在 Rest framework json api github page 中稍作挖掘后,我发现这个问题要求支持批量操作。显然,他们在这个拉取请求中添加了它,您可以在评论中看到多个对象的正确格式。

你的应该是这样的:

{
"data": [
    {
        "type": "MySerializer",
        "attributes": {
            "field_1": 1,
            "field_2": 0.05,
            "field_3": "abc"
        }
    },
    {
        "type": "MySerializer",
        "attributes": {
            "field_1": 1,
            "field_2": 0.05,
            "field_3": "abc"
        }
    },
    {
        "type": "MySerializer",
        "attributes": {
            "field_1": 1,
            "field_2": 0.05,
            "field_3": "abc"
        }
    }
]

}

解析器很可能无法解析您提供的格式的数据,这就是您request.data为空的原因。

编辑2:

虽然批量操作功能尚未集成到 json-api 规范中,但 Django Rest JSON-API 已经为其添加了一个特殊的解析器。所以你必须添加这个解析器JSONAPIBulkParser才能让它工作。在 PR 中查看此评论


推荐阅读