Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

[Dúvida] Como fazer um query no Django?

Estou com dificuldades para entender e criar um query que basicamente mostra o nome de uma classe se for igual a o nome de outra class. E se o cliente ativer telegram status true

exemplo:

(esse model recebe valores de um bot, ou seja, eu nao crio na mao cada valor)

class MessageBot(models.Model):
  chat_id = models.BigIntegerField()
  chat_group = models.CharField(max_length=30)
  first_name = models.CharField(max_length=30)
  last_name = models.CharField(max_length=60)
  date = models.DateTimeField(auto_now_add=True)
  messageUser = models.TextField()

  def __str__(self):
    return f"{self.first_name} {self.last_name} - {self.chat_group}"
class Client(models.Model):
  company_admin_ti = models.OneToOneField(
          'ClientAdminTI',
          on_delete=models.CASCADE,
          verbose_name= u'Administrador TI')

  company_admin_accounting=models.OneToOneField(
          'ClientAdminAccounting',
          on_delete=models.CASCADE,
          verbose_name= u'Administrador Contabilidade')

  company_location = models.OneToOneField(
          'ClientLocation',
          on_delete=models.CASCADE,
          verbose_name=u'Endereço',
          unique=True,
          null=False)

  company_name = models.CharField(
          max_length=30,
          verbose_name = u'Razao social',
          unique=False)

  company_register_name = models.CharField(max_length=30,
          verbose_name = u'Nome da Empresa',
          unique=True)

  company_id = models.CharField(
          max_length=30,
          verbose_name = u'CNPJ da empresa',
          unique=True)

  telegram_status = models.BooleanField(
          unique = False,
          verbose_name= u'Telegram activated?',
          null = False,
          default= False)

#tentativa de adicionar algo que chega no resultado esperado
  telegram_client_group = models.ForeignKey(                                                                                           
         MessageBot,                                                                                                                   
         on_delete=models.CASCADE,                                                                                                     
          #related_name='chat_telegram',                                                                                               
          #related_query_name='batata',                                                                                                
          default='',                                                                                                                  
          null=True,                                                                                                                   
          blank=False,
          verbose_name=u'Grupo do Telegram')

Estou aceitando dicas e boas praticas. Desde ja agradeco a atencao!!

1 resposta
solução!

Oi Samuel, tudo bem?

Pra sua situação, onde você deseja obter o nome de uma classe se for igual ao nome de outra classe e o cliente tiver o status de Telegram ativado, você pode utilizar a função filter() do Django para especificar as condições que deseja.

Você pode acessar a tabela MessageBot e filtrar as instâncias onde o nome da classe seja igual ao nome da outra classe. Isso pode ser feito usando a notação de duplo sublinhado (__) para acessar os campos relacionados.

Depois, você pode encadear essa condição com outra usando o operador lógico & (AND), pra garantir que o cliente também tenha o status de Telegram ativado. Pra isso, você pode utilizar a função filter() novamente na tabela Client e especificar a condição do status do Telegram.

Ao usar filter(), você tá criando uma condição de consulta, e os resultados serão os registros que atendem a essas condições.

E, é uma boa prática manter seu código limpo e legível. Se a query estiver ficando muito complexa, considere dividir a lógica em etapas menores ou utilizar anotações para melhor compreensão.

Espero que essas dicas ajudem.

Boa sorte com o seu projeto!

Um abraço.