Функция on_save() не срабатывает при создании модели

Я получил две следующие модели:

class Stuff(models.Model):
   ... 
   def custom_function(self):
   ...


class MyModel(models.Model):
    name = models.CharField(max_length=200)
    many_stuff = models.ManyToManyField(Stuff, related_name="many_stuff+")
    many_other_stuff = models.ManyToManyField(Stuff, related_name="many_other_stuff+")
 
    def __init__(self, *args, **kwargs):
        super(MyModel, self).__init__(*args, **kwargs)
        for stuff in self.many_stuff.all():
            many_stuff.custom_function()
            
    def on_save(self, *args, **kwargs):
        for stuff in self.many_stuff.all():
            many_stuff.custom_function()
        super(MyModel, self).save(*args, **kwargs)

Когда я создаю новый экземпляр MyModel через Django Admin, я хочу выполнить для каждого объекта Stuff функцию. Это работает on_save, но я не могу заставить это работать на __init__ по какой-то причине. Если я создаю новый экземпляр, функции не выполняются. Если я сохраняю только что созданный экземпляр, функции выполняются.

Более конкретно, когда я использую этот метод __init__, модель ломается при создании экземпляра с ошибкой:

MyModel needs to have a value for field "id" before this many-to-many relationship can be used.

Я также попытался сделать то же самое с сигналом post_save, вместо того чтобы использовать __init__ и on_save, но у меня возникла та же проблема. При создании объекта функция custom_function не выполнялась, но она выполнялась, когда я сохранял объект после его создания, нажав на кнопку сохранения.

Есть идеи?

Вы просто не можете создать M2M join при создании объекта.

Потому что поля модели M2M не имеют реальных полей в БД, а имеют промежуточную таблицу, которая хранит id из обеих моделей. Когда вы создаете отношение между двумя объектами, оба объекта должны иметь значение id, готовое к использованию.

Сначала создайте экземпляр MyModel без полей M2M, а затем установите поля M2M. Что-то вроде этого;

newModel = MyModel.objects.create(name=someting)
newStuff = Stuff.objects.create(..)

newModel.many_stuff.add(newStuff)
Вернуться на верх