django - 使用 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
通过例如调用put
API 上的方法来部分更新 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 请求,只是为了获取我不想更新的字段的状态。
有办法解决吗?
解决方案
首先,要进行部分更新,您需要有 PATCH 请求而不是 PUT。
由于您使用的是 ModelViewSet drf 应该自动识别并设置 partial=True 并仅更新在 api 有效负载中发送的字段。 ModelViewSet 文档-DRF
推荐阅读
- wordpress - 我想让我的电子邮件文本字段像图像中的那样
- javascript - 请求的模块“./server/controller/controller.js”不提供名为“default”的导出
- r - st_geometry<-.data.frame(*tmp*, value = value) : 继承(value, "sfc") || is.character(value) 不是 TRUE
- python - AttributeError: 'NoneType' 对象没有属性 'push'
- java - 使用 While 循环重复 GUI 程序的问题
- node.js - 如何使用 discord.js 获得成员少于 10 人的公会
- excel - 根据另一列中的依赖值对 Excel 数据进行排序
- function - 如何工作将函数定义为#define Max(a,b)(a>b?a:b)
- dynamics-crm - 从子网格上的“添加现有..”弹出对话框中隐藏/删除“+新记录”
- python - 如何在列表中附加 csv 文件中的两列?