I don't know if it's applicable to your use case, but if you work on these models a lot you might want to consider using Minizinc/Flatzinc as a modeling language.
Nothing against python, but those models get unwieldy very quickly, especially when there are tons of overlapping constraints popping up.
Well, I usually use MIP in larger processing pipelines, which I tend to write in python. For example see step 4. in this algorithm about automatically generating a public transit map layer:
https://site.transitapp.com/how-we-built-the-worlds-pretties...
Nothing against python, but those models get unwieldy very quickly, especially when there are tons of overlapping constraints popping up.