Как переопределить метод 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
Метод можно оставить как есть, не нужно его переопределять