Как переопределить метод save() модели Django Model

У меня есть модель, которая выглядит следующим образом.

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 модели, как показано ниже, но это не сработало

def save(self, *args, **kwargs):
    super(TemplateId, self).save(*args, **kwargs)

Поскольку данные сохраняются в полях модели при получении ответа API, в следующий раз при получении тех же данных из ответа API, в dB возникает ошибка дублирования данных. Как мне переопределить все поля dB при каждом вызове API?

Если объекты существуют, обновите их. Если нет, создайте его. 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()

Если под переопределением вы подразумеваете обновление template_name конкретного шаблона id, то вам нужно изменить:

    obj = TemplateId(template_id=template_id["id"], template_name=template_id["name"])
    obj.save()

to

     obj = TemplateId.objects.get(id=template_id["id"])
     obj.template_name = template_id["name"]
     obj.save()

Потому что в вашем случае вы ищете конкретную запись с 2 условиями, но ничего не меняете при сохранении. save Метод можно оставить как есть, не нужно его переопределять

Вернуться на верх