3
respostas

Realizar POST em banco diferente do DEFAULT

Pessoal, boa tarde!

No meu projeto do Rest Framework estou utilizando dois bancos. Como faço para que na hora de realizar o POST eu selecione o banco que deve ser direcionado o POST?

Obrigado!

3 respostas

Pessoal, resolvi o caso da seguinte maneira:

dentro do Serializer criei um objeto validated_data:

def create(self, validated_data):
    return Sze010.objects.create(**validated_data)

Já no models, manipulei algumas informações que veio da requisição POST e alterei o banco destino. (As informações alteradas são alguns campos que são obrigatórios no banco que o usuário não deve manipular)

   def save(self, *args, **kwargs):
        getRecnos = Sze010.objects.order_by('r_e_c_n_o_field').using('protheus').all().last()

        lastNumber = getRecnos.r_e_c_n_o_field + 1

        self.r_e_c_n_o_field = lastNumber
        self.d_e_l_e_t_field = ''
        self.r_e_c_d_e_l_field = 0
        self.ze_filial = '01'
        using = 'protheus'
        kwargs['using'] = using
        return super(Sze010, self).save(*args, **kwargs)

Funcionou da maneira como precisava! Só não sei se fiz da maneira mais correta.

Obrigado!

Olá Felipe, tudo bem com você?

Fico feliz em saber que conseguiu solucionar sua dúvida. Esse retorno informando como solucionou é muito importante.

O uso do atributo using que permite especificar qual banco de dados deve ser usado ao executar consultas ou realizar operações de salvamento em objetos de modelo é uma forma correta de direcionar para qual banco a operação deve ocorrer.

Não hesite em voltar ao fórum para continuar aprendendo e interagindo com a comunidade.

Em caso de dúvidas estou à disposição.

Abraços e bons estudos!

Felippe, tudo bem?!

Evoluindo um pouco nas pesquisas e testes arrumei uma outra solução que pra mim ficou mais interessantes:

Criei o arquivo dbrouters.py e nele coloquei o mapeamento do banco para o modelo:

from ferias.models import Sze010, Srh010, Sqb010, Srf010, Szh010

class MyDBRouter(object):
    def db_for_read(self, model, **hints):
        if model == Sze010 or model == Sqb010 or model == Srh010 or model == Srf010 or model == Szh010:
            return 'protheus'
        return None

    def db_for_write(self, model, **hints):
        if model == Sze010 or model == Szh010:
            return 'protheus'
        return None

Já dentro do settings.py inclui o registro:

DATABASE_ROUTERS = ('ferias.dbrouters.MyDBRouter',)

Desse modo não utilizo mais o using.

Acrescentei ainda no settings.py o registro:

ALLOWED_HOSTS = ['192.168.0.117']

Agora subo a API especificando o IP para que eu consiga consumir a API pelo AndroidStudio localmente... Não estava permitindo o consumo utilizando como localhost.