У меня настроен проект 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())