【问题标题】:How to send an array of json object in PUT request for non-primary Key in Django?如何在 Django 中对非主键的 PUT 请求中发送 json 对象数组?
【发布时间】:2021-07-16 14:06:40
【问题描述】:

我收到一个 PUT 请求,其中包含相同非主 ID 的 json 对象数组。

例子:

{
   "some_non_pk_id":101,
   "user_entries":[
      {
         "name":"foo",
         "height":1.56
      },
      {
         "name":"bar",
         "height":1.76
      },
      .
      .
      .
   ]
}

我需要upsert表格中看起来像这样的对象

+----+----------------+------+--------+
| id | some_non_pk_id | name | height |
+----+----------------+------+--------+
|  1 |            101 | foo  |   1.56 |
|  2 |            101 | bar  |   1.76 |
+----+----------------+------+--------+

PUT/PATCH 请求的 url 将是 /api/details/?some_non_pk_id=101。我不知道如何覆盖ModelViewSetupdatepartial_update 来更新它。

如果请求正文可以更改为这样的内容,我可以。更改请求 bosy 由我控制。

[
   {
      "some_non_pk_id":101,
      "name":"foo",
      "height":1.56
   },
   {
      "some_non_pk_id":101,
      "name":"bar",
      "height":1.76
   }
]

【问题讨论】:

    标签: python-3.x django django-rest-framework put


    【解决方案1】:

    从您的示例看来,您不想执行 upsert 本身,而是用一组新项目替换一组数据库项目(那些具有给定 some_non_pk_id 的项目)。

    如果这是您的目标,那么您要做的是在事务中,删除旧集并创建新集。

    以您的初始负载为指导,您可以执行以下操作:

    def update(self):
        # Replace the following line with however you plan to get the payload
        payload = json.loads(self.request.body)
        with transaction.atomic():
            identifier = payload["some_non_pk_id"]
            # replace `YourModel` with the actual name of your model
            YourModel.objects.filter(some_non_pk_id=identifier).delete()
            for item_kwargs in payload["user_entries"]:
                item_kwargs["some_non_pk_id"] = identifier
                YourModel.objects.create(**item_kwargs)
    

    【讨论】:

    • 我明白你的意思,但我确实想成为一个 upsert。因为第一次新记录将被插入到数据库中。
    • @AnirbanNag'tintinmj' 如果该 id 没有记录,则删除是空操作,并且将创建新记录
    猜你喜欢
    • 2017-09-18
    • 2016-09-26
    • 2021-03-14
    • 1970-01-01
    • 2019-10-24
    • 2021-03-16
    • 2021-06-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多