You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 08:06:04