首页 > 解决方案 > 如何覆盖 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_nametemplate_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 字段?

标签: djangodjango-modelsdjango-rest-frameworkdjango-formsdjango-admin

解决方案


如果对象存在,请更新它。如果没有,请创建它。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()

推荐阅读