Django中如何将API数据保存至Model并实现数据更新?
解决Django节点数据保存与更新问题
第一步:修正模型,添加唯一约束
每个节点名称(node字段)应是唯一标识,先给模型的node字段加上unique=True,确保数据库不会出现重复节点记录,同时作为后续更新的匹配依据:
class Node(models.Model): node = models.CharField(max_length=2000, null=True, blank=True, unique=True) cpu = models.FloatField(null=True, blank=True) # 内存以字节数返回,用BigIntegerField比FloatField更合适,避免精度损耗 mem = models.BigIntegerField(null=True, blank=True) status = models.CharField(max_length=2000, null=True, blank=True)
修改后执行迁移命令更新数据库:
python manage.py makemigrations python manage.py migrate
第二步:用update_or_create实现批量保存与更新
Django内置的update_or_create方法可同时处理「新节点创建」和「旧节点更新」逻辑:它会根据指定条件查找记录,存在则更新字段值,不存在则创建新记录。替换你原来的循环代码:
for node_data in r: Node.objects.update_or_create( # 以node名称作为唯一匹配条件 node=node_data['node'], # 需要更新或初始化的字段集合 defaults={ 'cpu': node_data['cpu'], 'mem': node_data['mem'], 'status': node_data['status'] } )
排查之前仅保存最后一条的原因
你之前的代码只留存最后一条记录,大概率是以下两种情况之一:
- 先打印
r确认API返回的是否为包含3条数据的完整列表,有可能你的API请求逻辑存在问题,仅获取到了最后一条数据 - 无唯一约束时,可能重复创建了多条同名节点记录,但查询时因排序问题只显示最后一条,
update_or_create可彻底避免该问题
内容的提问来源于stack exchange,提问作者Matija Terzić
相关产品推荐
相关产品推荐

