Копирование входных данных модели Django в другую базу данных Django
Я пытаюсь понять, есть ли способ, чтобы после того, как я загрузил что-то в один из моих файлов базы данных Django, эта же загрузка была бы загружена и в другой файл базы данных, так что если я удалю один из них, он будет сохранен в другом.
class CompanyInfo(models.Model):
company_name = models.CharField("Company Name", unique=True, max_length=50, default="")
# Identifiers
identifier = models.IntegerField(default=0)
# Company Information
sector = models.CharField("Sector", max_length=50,default="")
location = models.CharField("Location", max_length=100, default="")
year_founded = models.IntegerField("Year Founded", default=2000)
company_description = models.TextField("Company Description", default="")
state_registered_in = models.CharField("State of Registration", choices=states_list, max_length=2, default=2)
company_url = models.URLField("Company URL", max_length=200, default="", blank=True, null=True)
phone_number = models.CharField("Phone Number", max_length=20,default="")
company_logo_url = models.ImageField("Company Logo", upload_to=None, height_field=None, width_field=None, max_length=100, blank=True, null=True)
facebook = models.URLField("Facebook URL", max_length=200, default="", blank=True, null=True)
linkedin = models.URLField("Linkedin URL", max_length=200, default="", blank=True, null=True)
instagram = models.URLField("Instagram URL", max_length=200, default="", blank=True, null=True)
email = models.EmailField("Email Address", max_length=40,default="")
def __str__(self):
return "{} from {}".format(self.company_name, self.location)
По сути, как только эти значения будут созданы для класса "CompanyInfo", я хочу, чтобы они также загружались в другой класс Django точно таким же образом, так что если я в конечном итоге удалю входные данные в классе "CompanyInfo", в другой созданной базе данных все еще будет сохраненная версия.
Есть несколько вариантов, например, переопределить сохранение или использовать менеджер моделей, но самый простой и тестируемый метод - использовать сигнал post_save: https://docs.djangoproject.com/en/dev/ref/signals/#post-save
Это позволяет захватывать экземпляры модели, которые сохраняются и обновляются, но обратите внимание, что при вызове .update()
сигнал пропускается, что может быть нежелательно.
Способ сохранения в резервной базе данных - это написание сигнала для извлечения всех полей и повторного сохранения. Я бы избегал update_fields
, так как некоторые разработчики не будут его использовать (он помогает оптимизировать запросы).
def save_to_backup(sender, instance, created: bool, using: str, **kwargs):
if using == "default":
# You don't want to continuously save/i.e. infinite loop
return
fields = instance._meta.get_all_field_names()
sender.objects.using("backup_alias").save(**{field: instance._meta.get_field(field) for field in fields})