от себя добавлю, Django ORM эмулирует constraintы программно
а меня очень порадовало одно поведение связанное с отложеными проверками целостности ключей, в случае потгрешки.
когда в случае проблемы она вылезала только при попытке закоммитить транзакцию. да вот только transaction.atomic(), может прикидываться как тарнзакцией так и точкой сохранения, в итоге блок успешно проходит без исключений, точка сохранения релизится, но в итоге всё отваливается в самом конце на коммите