Django中更新数据时如何不保存传值为null的字段且不抛出错误
首先调整模型字段定义,避免空值存储报错:
class Education(models.Model): title = models.CharField(max_length=100, null=True, blank=True) content = models.TextField(null=True, blank=True)
原模型中仅设置default=None但未开启null=True,空值存入数据库时会触发报错,需要先补充字段属性。
解决方案(按开发场景选择)
场景1:使用Django REST Framework(DRF)开发接口
重写序列化器的update方法,过滤掉值为None的字段,不让其参与更新操作:
from rest_framework import serializers from .models import Education class EducationSerializer(serializers.ModelSerializer): class Meta: model = Education fields = ["title", "content"] def update(self, instance, validated_data): # 过滤所有值为None的字段,仅保留有效值更新 validated_data = {k: v for k, v in validated_data.items() if v is not None} for attr, value in validated_data.items(): setattr(instance, attr, value) instance.save() return instance
注意:如果使用
PATCH请求做局部更新,DRF默认只会更新客户端传入的字段,只要客户端不传content参数本来就不会覆盖原有值,上述方案专门处理客户端**显式传入content: null**的场景。
如果需要该过滤逻辑全局生效,可以封装为公共序列化器基类,所有业务序列化器直接继承即可。
场景2:原生Django视图处理请求
如果没有使用DRF,直接在视图层处理请求参数时过滤空值:
from django.http import JsonResponse from .models import Education import json def update_education(request, edu_id): try: edu_obj = Education.objects.get(id=edu_id) except Education.DoesNotExist: return JsonResponse({"error": "记录不存在"}, status=404) # 解析请求参数,这里以JSON请求为例 req_data = json.loads(request.body) # 过滤空值+校验字段合法性 update_fields = { k: v for k, v in req_data.items() if v is not None and hasattr(Education, k) } # 执行更新 for field, value in update_fields.items(): setattr(edu_obj, field, value) edu_obj.save() return JsonResponse({"code": 0, "msg": "更新成功"})
无需实例校验的场景也可以直接调用ORM的update方法:
Education.objects.filter(id=edu_id).update(**update_fields)
内容的提问来源于stack exchange,提问作者reza_khalafi
相关产品推荐
相关产品推荐

