簡體   English   中英

Django Rest Framework 創建多個對象

[英]Django Rest Framework create multiple objects

這是我到目前為止。

我的序列化器:

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'
            }
        }
    }

它似乎工作得很好,並且創建了對象。

我嘗試了幾種方法來容納有效載荷:

  • 將對象列表放在attributes字段內。
  • 將實例列表直接放在data字段上,但它返回對象錯誤或空request.data

我應該如何發送多個對象的數據,是否有可能,我在很多文章中都讀到過,只需在序列化程序實例上放置many=True就足以完成此任務,但我無法從要求。

我錯過的任何步驟或其他解決方法?

編輯

忘了說兩件事

  1. 我正在使用django rest 框架 json api庫,這可能是數據為空的原因嗎?
  2. 我放置了字典,因為我正在測試端點,並且在發送數據時使用 json.dumps(payload)。

好的,我實際上很驚訝單個對象實例的創建有效,因為數據的格式似乎不正確。 當使用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 中查看此評論

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM