¿Cómo puedo obtener todos los objetos a los que un usuario tiene permisos específicos en django guardian?

Actualmente estoy haciendo un bucle muy torpe sobre todos los objetos, pero eso va a ser lento:

videos = Video.objects.all() video_list = [] for video in videos: checker = ObjectPermissionChecker(request.user) if checker.has_perm('view_video', video): video_list.append(video) 

Me imagino que debe haber una forma de obtener todos los objetos para los que este usuario tiene permisos.

Hace unos días hubo una actualización con una nueva función de acceso directo llamada “get_objects_for_user”. Si utiliza una versión anterior de guardian y no puede actualizar, simplemente puede copiar los códigos desde allí.

 from guardian.shortcuts import get_objects_for_user ... videos = get_objects_for_user(request.user, "view_video", Video.objects.all()) 

Siempre hace 3 consultas. Si especifica el parámetro “use_groups” en False, entonces se realizan 2 consultas, sin embargo, el conjunto de consultas devuelto no contendrá objetos para los cuales los grupos de usuarios tengan permisos. También puede especificar una lista de nombres de código, en lugar de un solo permiso si es necesario. Lea más aquí .

Sabes que estás creando una nueva instancia de ObjectPermissionChecker en cada bucle mientras no tienes que hacer eso, y sugeriré hacer algo como esto que puede ser más sintácticamente azúcar y quizás te pueda dar más velocidad.

 checker = ObjectPermissionChecker(request.user) videos = Video.objects.all() video_list = [video for video in videos if checker.has_perm('view_video', video)] 

Para su pregunta, puede usar los permisos de django-object. Aquí encontrará más detalles sobre cómo usar.

Si desea acelerar drásticamente, ¿por qué no solicita a la base de datos que saque solo los objetos que le interesan?

 content_type = ContentType.objects.get_for_model(Video) perm = Permissions.objects.get(codename='view_video'.split('.')[-1]) objs = set( UserObjectPermissions.objects.filter(user=user, permission=perm, content_type=content_type) ) # and if you want to include groups objs.update( set( GroupObjectPermissions.objects.filter(group__user=user, permission=perm, content_type=content_type) ) ) 

Esto debería obtener todos los objetos de usuario a los que el usuario tiene permiso a través de su usuario y grupo.