Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

224
Vistas
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 Respuestas
Responde la pregunta

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 Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda