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

从Shell更新Django模型字段:补全4位邮政编码为5位

批量给Django模型的邮政编码补前导0的正确姿势

为啥你之前的代码报错?

你直接用Python的len()和字符串拼接写ORM语句肯定不行——Django ORM的查询和更新是要转换成SQL语句跑在数据库里的,不是直接执行本地Python代码。你写的zip_code在ORM眼里不是数据库字段,而是一个未定义的Python变量,所以才会触发NameError。

两种靠谱的解决方法

方法一:纯ORM批量更新(效率高)

先导入需要的数据库工具函数:

from django.db.models import Value
from django.db.models.functions import Length, Concat

然后一行代码搞定批量更新:

Entry.objects.filter(Length('zip_code') == 4).update(zip_code=Concat(Value('0'), 'zip_code'))

简单解释:

  • Length('zip_code'):让数据库计算每条记录zip_code字段的长度,筛选出长度为4的条目
  • Concat(Value('0'), 'zip_code'):让数据库把字符串'0'和原zip_code的值拼接起来,直接完成字段更新

方法二:分批处理(适合超大数据量,避免锁表)

如果数据量实在太大,一次性更新可能导致数据库锁表影响业务,可以分批处理:

from django.db.models.functions import Length

# 每次处理100条,可根据数据库性能调整chunk_size的数值
for entry in Entry.objects.filter(Length('zip_code') == 4).iterator(chunk_size=100):
    entry.zip_code = entry.zip_code.zfill(5)
    entry.save(update_fields=['zip_code'])

细节说明:

  • zfill(5):Python自带的字符串方法,自动在左侧补0直到字符串长度为5,就算原字段已经是5位也不会出错
  • update_fields=['zip_code']:只更新zip_code这一个字段,比全量保存整个模型对象效率高很多

内容的提问来源于stack exchange,提问作者PolarBear

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 13:50:31