Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

219
Visualizações
Django ORM Left Join en la misma tabla

Tengo un sistema de permisos personalizado en un proyecto de django que puede vincular a cualquier usuario a cualquier instancia de modelo específico para otorgar permisos sobre ese objeto. Es más complejo que esto, pero resumido:

 class Permission(models.Model): user = models.ForeignKey(User) content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE) object_id = models.PositiveIntegerField() content_object = GenericForeignKey('content_type', 'object_id')

Quiero consultar todos los permisos para cualquier usuario, que están vinculados a los mismos objetos de contenido en los que se le ha otorgado permiso a un usuario en particular. Expresado de otra manera, el usuario en cuestión quiere ver quién más tiene permisos sobre cualquiera de los mismos objetos que él tiene.

En SQL, lo siguiente hace el truco:

 SELECT perm1.* FROM app_permission perm1 LEFT JOIN app_permission perm2 ON perm2.user_id = 12345 AND perm1.content_type_id = perm2.content_type_id AND perm1.object_id = perm2.object_id WHERE perm2.id IS NOT NULL;

¿Es posible lograr esto en Django ORM?

over 4 years ago · Santiago Trujillo
1 Respostas
Responde à pergunta

0

Puede trabajar con una subconsulta Exists [Django-doc], que es probablemente lo que pretende hacer, así que:

 from django.db.models import Exists, OuterRef Permission.objects.filter( Exists(Permission.objects.filter( user_id=12345 , content_type_id=OuterRef('content_type_id'), object_id=OuterRef('object_id') )) )

otra opción podría ser usar un "truco uno-dos" con el modelo ContentType y trabajar con:

 from django.db.models import F Permission.objects.filter( content_type__permission__user=12345, content_type__permission__id__isnull=False, content_type__permission__object_id=F('object_id') )
over 4 years ago · Santiago Trujillo Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda