Обновление полей в django ManyToMany

У меня проблемы с обновлением calculating_special_order_items, calculating_floor_special_order_items, order_total, ship_total, confirm_total, real_total и calculating_total. Когда я сохраняю новый экземпляр с ship_special_order_items через view, он сохраняется нормально, calculating_special_order_items обновляется и все totals обновляются правильно и отображаются в django admin site правильно, но когда я пытаюсь обновить calculating_special_order_items с сохранением confirm_special_order_items, он не обновляется правильно.

Я перепробовал все за 2 дня, даже код внутри модели, даже сигнал пост-сохранения, даже пользовательскую модельную форму для админки django, у меня нет решений, пожалуйста, помогите мне, если вы столкнулись с такой же проблемой и если вы решили ее успешно. Спасибо.

с кодом внутри модели, даже с сигналом post-save, даже с пользовательской моделью для django admin.

I believe that. All these methods will not work, because Django populates or updates the ManyToManyField [Django-doc] after it has saved the object, so by the time your def save(..) runs, or your post_save signal [Django-doc], since at that time, there is no data yet, or the data is outdated.

Можно было бы работать с m2m_changed сигналом [Django-doc] и подписывать его на все ManyToManyField, но я не сторонник этого: если, например, изменятся данные самого ProductVariation, то это тоже может повлиять, без изменения Order или .product_variations.

I think it makes more sense to work with a @property [python-doc], or .annotate(…) [Django-doc] when you need to do this in bulk or to filter on the aggregate.

Keeping an «aggregate» in a model object is often not a good idea. The main problem is that a lot of scenarios can trigger the aggregate to get outdated, and catching all these cases is almost impossible. I summarized some problems with signals in this article [django-antipatterns].

Я не нашел достаточно хорошего решения для сохранения автоматически вычисляемых calculating_special_order_items и calculating_floor_special_order_items, поэтому для меня достаточно того, что у меня есть поле только для чтения с @property, и мое решение таково:

Вернуться на верх