Могу ли я попросить Django запустить какую-либо функцию после загрузки файла через админ-панель? - PullRequest
0 голосов
/ 17 июня 2019

У меня есть такие модели:

class NameReplacements(models.Model):
    excel_file = models.FileField(upload_to='excel_files')

class NameReplacement(models.Model):
    name_to_replace = models.CharField(max_length=255, default='')
    name_to_replace_with = models.CharField(max_length=255, default='')

Я загружаю файл для NameReplacements через административную панель.

В другом месте моего приложения у меня есть код, который читает файл из последнего экземпляра этой модели и сохраняет данные из каждой строки этого файла как NameReplacement экземпляр:

def remove_old_name_replacements():
    '''Removes all instances of NameReplacement from database'''
    replacements = NameReplacement.objects.all()
    replacements.delete()

def import_name_replacements():
    '''Imports name replacements to database from last uploaded Excel file'''

    remove_old_name_replacements()

    replacements = NameReplacements.objects.last()
    df = pd.read_excel(replacements.excel_file.path)

    for i in range(len(df)):
        name_to_replace=str(df.loc[i, 'managers']),
        name_to_replace_with=str(df.loc[i, 'best_matches'])
        name_replacement = NameReplacement(name_to_replace, name_to_replace_with)
        name_replacement.save()

В настоящее время я просто запускаю import_name_replacements вручную из оболочки Django всякий раз, когда загружаю новый файл.

Есть ли способ указать Django запускать этот код автоматически всякий раз, когда я загружаю файл через панель администратора?

Ответы [ 2 ]

1 голос
/ 17 июня 2019

Добавьте следующий метод к вашей модели NameReplacements, который переопределит метод save ().

def save(self, *args, **kwargs):
    super(NameReplacements, self).save(*args, **kwargs)
    import_name_replacements()
0 голосов
/ 17 июня 2019

Я не совсем понимаю, как работает процесс загрузки. Но вы могли бы вызывать метод import_name_replacements каждый раз, когда вы создаете объект NameReplacements, для этого вам нужно переопределить метод save, вот пример:

    def save(self, **kwargs):
        super(NameReplacements, self).save(**kwargs)
        import_name_replacements()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...