Переопределение метода сохранения нескольких моделей Django без внесения изменений в каждую отдельную модель - PullRequest
0 голосов
/ 17 июня 2019

У меня настроен проект django, в котором у меня есть 6 (и, возможно, добавит больше в будущем) моделей. Мне нужно настроить интерфейс администратора таким образом, чтобы при каждом обновлении или добавлении объекта в любую из моделей он записывал данные в файл из класса LogEntry. Я выбрал этот метод, потому что сигналы после сохранения будут запускаться при запуске сервера (я докеризировал это приложение и импортирую таблицы в базу данных postgres из уже существующих файлов CSV), и они выдают ошибки. Для достижения желаемой функциональности я поместил в файл models.py следующее:

class ModdedModel(models.Model):
    def save(self, *args, **kwargs):
        changes_file = ("new_changes.txt","w")
        content2 = LogEntry.objects.all()
        changes_file.write(content2)
        super(ModdedModel, self).save(*args,**kwargs)   

Затем я унаследовал эту модель для всех последующих таблиц, которые я хочу создать, используя Django ORM. Однако эта ошибка появляется,

SystemCheckError: System check identified some issues:

ERRORS:
mdp.Variants.variants: (models.E006) The field 'variants' clashes with the field 'variants' from model 'mdp.moddedmodel'.

Я предположил, что, возможно, произошла какая-то ошибка пространства имен, и изменил имя поля на варианты s , чтобы проверить, будет ли это иметь значение, но потом я получил это вместо

Did you rename variants.variants to variants.variantss (a CharField)? [y/N] y
You are trying to add a non-nullable field 'moddedmodel_ptr' to enrichment without a default; we can't do that (the database needs something to populate existing rows).
Please select a fix:
 1) Provide a one-off default now (will be set on all existing rows with a null value for this column)
 2) Quit, and let me add a default in models.py

Я не знаю, что вызывает добавление этого поля ptr, когда я делаю это. Я думаю, я мог бы просто добавить метод save для каждого отдельного класса, но для этого должен быть более чистый метод. Это не имеет никакого отношения к моему методу сохранения (я уверен, что это было бы очевидно из ошибок в любом случае), потому что я попробовал его для одного класса, и он отлично работает. Для справки, если нужно, это мой переопределенный метод сохранения,

def save(self, *args, **kwargs): 
    super(Enrichment, self).save(*args,**kwargs)    
    changes_file = open("new_changes.txt","w+")
    changes = LogEntry.objects.all()
    #print(changes)
    for change_made in changes:
        #print(change_made, changes)
        changes_file.write(str(change_made))
    changes_file.seek(0)
    #print(changes_file.read())
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...