Django: модель __init __ () вызывается при каждом обновлении - PullRequest
1 голос
/ 30 июня 2011

У меня довольно загадочная проблема в одной из моих моделей.Я переопределил __init__ следующим образом:

class Program(models.Model)
    ...
    def __init__(self, *args, **kwargs):
        super(Program, self).__init__(*args, **kwargs)
        for m in Milestone.objects.all():
            try:
                ProgramMilestone.objects.create(milestone = m, program = self)
            except IntegrityError: # The link already exists.
                pass

, где ProgramMilestone - это таблица компоновщиков (использующая through='...') между Milestone и Program.

.Milestones добавляется в Program только при создании программы, но сейчас, когда я даже открываю Программу в интерфейсе администратора Django, она запускает цикл for m... (что делает невозможным удаление любых объектов ProgramMilestone в Djangoadmin, так как они будут просто переделаны после обновления).

Не понимаю ли я, что делает __init__, и если да, то как я могу создать такое поведение (то есть одноразовый код, который запускается только при создании экземпляра)

Ответы [ 3 ]

8 голосов
/ 30 июня 2011

Если я вас правильно понял, вы хотите запустить некоторый код при создании программы.

Вы можете использовать сигнал post_save и проверить флаг created.

https://docs.djangoproject.com/en/dev/ref/signals/#post-save

Имея код, прослушивающий этот сигнал, вы можете запускать его при каждом создании Программы, а не при ее изменении.

3 голосов
/ 30 июня 2011

Метод __init__ вызывается всякий раз, когда создается объект Program в памяти. Это происходит, когда вы читаете Программы из базы данных, а также время, когда вы действительно создаете новые объекты Программы на диске.

2 голосов
/ 30 июня 2011

То, что является экземпляром.Инстанциация - это когда объект Python создается с нуля или с использованием значений из базы данных.

Возможно, вы хотите переопределить метод save - в вашей версии установите флаг, если self.pk равно Noneвызовите save суперкласса, затем запустите ваш код, если установлен флаг.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...