Em dois projetos distintos, apliquei duas das técnicas mencionadas aqui: (1) uma base port tenant, e (2) uma base única usando tenant_id.
Em (1)
- criei um middleware para descobrir o tenant a partir de detalhes da requisição e injetar a informação no objeto request.
- utilizo um database router para descobrir qual banco usar a partir da informação injetada.
- fui obrigado a usar uma variável global (thread local) para suportar os routers. (Sugestões são bem vindas).
- altero os settings on-the-fly para permitir a criação de novos tenants via web, e não precisar alterar o settings.py. (Reconheço os perigos).
Resultado:
- aumentou bastante a complexidade.
- eliminou todos os bugs de acesso cross-tenant.
- apaguei bastante código de teste que validava cross-tenant.
- melhorou a performance.
Em (2)
- apliquei a solução simples de inserir o campo no modelo.
Resultado
- simples.
- necessário tratar as questões de unique_together.
- necessário testar código contra bugs de cross-tenant.
Se alguém quiser trocar idéia, me passa um email.
Abs