Функция 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)