Problema

Hoje eu me deparei com um bug no trabalho que quando resolvi pareceu besta. Sempre parece besta depois de resolvido.

O erro era esse:

django.db.utils.ProgrammingError: relation "template" does not exist

Basicamente minha tabela template não estava sendo encontrada. O que era estranho pois a tabela com certeza existia no banco, eu conseguia consultá-la com SQL e também a outra tabela plan estava sendo recuperado corretamente e referenciava essa tabela template.

E mais, quando eu executava um script para recuperar algum objeto dessa tabela, dava certo.

Esse era o script:

# test_template.py
from models import Template

template = Template.objects.get(pk=1)
print(template.name)

E o comando pra testar:

python manage.py tenant_command shell --schema=schema1 < test_template.py

Solução

Depois de muito bater a cabeça consegui encontrar onde estava o erro. Bom, eu já sabia que a tabela não estava sendo encontrada e isso já aconteceu comigo antes pois o object manager não estava configurando corretamente o tenant em que devia procurar a tabela.

Olhando melhor no código pude encontrar o momento em que o plan era recuperado:

with schema_context(tenant_id):
    plan = Plan.objects.get(pk=plan_id)

Vê só, a consulta tá sendo executada dentro de um schema_context. Enquanto que no momento de consultar o template o schema_context não estava declarado:

template = plan.template

Enfim, a solução foi simples, movi essa linha em que declaro a variável template para logo abaixo da linha em que o plan é recuperado. Daí a tabela template é encontrada no tenant correto.

Problema resolvido!