Принцип работы Django ManyToManyField заключается в том, что он создает дополнительную таблицу. Скажем, у вас есть две модели, ModelA и ModelB. Если вы сделали ...
ModelA.model_b = models.ManyToManyField(ModelB)
Что Django на самом деле делает за сценой, так это создает таблицу ... app_modela_modelb
с тремя столбцами: id
, model_a_id
, model_b_id
.
Держите эту мысль в уме. Что касается сохранения ModelB, Django не присваивает ему идентификатор, пока он не будет сохранен. Технически вы можете вручную назначить ему идентификатор и избежать этой проблемы. Кажется, вы позволяете django справиться с тем, что вполне приемлемо.
У Джанго проблема с M2M. Зачем? Если у ModelB еще нет идентификатора, что входит в столбец model_b_id
таблицы M2M? Ошибка для нуля product_id
более чем вероятна ошибка ограничения нуля для поля M2M, а не для идентификатора записи ModelB.
Если вы хотите, чтобы они "преуспели вместе" или "провалились вместе", возможно, пришло время заняться транзакциями. Вы, например, заключаете все это в транзакцию и выполняете откат в случае частичного сбоя. Лично я не проделал большую работу лично в этой области, так что, надеюсь, кто-то еще поможет в этой теме.