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?
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') )