django - 如何覆盖 Django 模型的 save() 方法
问题描述
我有一个看起来像这样的模型。
import uuid
from django.db import models
class TemplateId(models.Model):
id = models.SmallAutoField(primary_key=True, serialize=False, verbose_name='ID')
template_name = models.CharField(max_length=255, default="")
template_id = models.UUIDField(max_length=255, default=uuid.UUID, unique=True)
def __str__(self):
return str(self.template_name)
class Meta:
ordering = ('-id',)
我有另一个函数/代码,我在其中调用 API 来获取template_name
并template_id
以 dB 存储它。但是每次当我得到 API 的响应时,我都想覆盖整个表(everytime deleting old record and then adding the new records
)
目前我正在这样做:
def fetch_template_id():
api_response = # calling the API
for template_id in api_response:
obj = TemplateId(template_id=template_id["id"], template_name=template_id["name"])
obj.save()
为了覆盖,我尝试在我的TemplateId
模型中覆盖 save 方法,如下所示,但它不起作用
def save(self, *args, **kwargs):
super(TemplateId, self).save(*args, **kwargs)
由于数据是通过获取 API 响应保存在模型字段中的,因此下次从 API 响应中接收到相同的数据时,会抛出 dB 中的重复数据错误。 如何使用每个 API 调用覆盖所有 dB 字段?
解决方案
如果对象存在,请更新它。如果没有,请创建它。def fetch_template_id():
api_response = # calling the API
for template_id in api_response:
try:
obj = TemplateId.objects.get(template_id=template_id["id"])
obj.template_name=template_id["name"]
except:
obj = TemplateId(template_id=template_id["id"], template_name=template_id["name"])
obj.save()
推荐阅读
- linux - 我有多个不同版本的文件名。如何从每个文件名中选择最高编号的版本
- reactjs - goBack() 按钮不起作用。HashRouter 反应
- plot - 单个图上的多个 Y 轴
- .net - 触摸屏上 Windows 窗体应用程序的本机控件?
- php - 测试要为用户显示的错误消息
- c++ - C++20 范围适配器的递归应用导致编译时无限循环
- gml - GMS2 - 为什么我会收到此语法错误?
- java - If Else 语句逻辑执行
- node.js - created_at 和 updated_at 的两列附加副本以不同的别名返回
- powershell - “add-newipaddress”导致“Windows 系统错误 1168”和“找不到对象”