首页 > 解决方案 > 使用 djangorestframework 使用 BooleanFields 部分更新模型

问题描述

我有一个这样的模型

class Status(models.Model):
   
   is_working = models.BooleanField(
        default=None,
        null=True
   )

   is_at_home = models.BooleanField(
        default=None,
        null=True
   )

使用相应的序列化器

class StatusSerializer(ModelSerializer):

    class Meta:
        model = Status
        fields = [
          "is_working",
          "is_at_home"
        ]

使用默认的 ModelViewSet

class StatusViewSet(viewsets.ModelViewSet):
    """
    """
    serializer_class = StatusSerializer
    queryset = Status.objects.all()

每当我Status通过例如调用putAPI 上的方法来部分更新 a 时,所有其他字段都会重置为False而不是保留其旧值。

说,我有一个Status看起来像这样的:

{
   "id": 1,
   "is_working": null,
   "is_at_home": null,
}

如果我put使用以下 JSON 调用:

{
   "is_working": true
}

我的数据现在看起来像这样

{
   "id": 1,
   "is_working": true,
   "is_at_home": false <-- GOT UPDATED
}

但是,我只想更新该is_working字段,以便我想要的结果是:

{
   "id": 1,
   "is_working": true,
   "is_at_home": null
}

这可能与 HTML 表单不为未选中的字段提供值这一事实有关。但是,我不使用任何 HTML 表单,因为我纯粹是通过 JSON 请求使用 API。

按原样使用序列化程序,我需要在更新模型之前执行额外的 get 请求,只是为了获取我不想更新的字段的状态。

有办法解决吗?

标签: djangodjango-rest-framework

解决方案


首先,要进行部分更新,您需要有 PATCH 请求而不是 PUT。

由于您使用的是 ModelViewSet drf 应该自动识别并设置 partial=True 并仅更新在 api 有效负载中发送的字段。 ModelViewSet 文档-DRF


推荐阅读