Tengo un CharField que contiene rutas, como: zero/one/two/three o root/usr/et_cetera
El número de separadores (aquí / ) nos da la profundidad del 'nodo' en la ruta, por lo que en el ejemplo anterior, three tiene una profundidad de 3.
En python, podría escribir 'zero/one/two'.count('/') , pero me pregunto cómo hacerlo en una consulta de Django.
Lo que busco es algo como lo siguiente:
# Hypothetical code, does not work Model.object.annotate(depth=CountChr('path', V('/'))).filter(depth=2)No puedo encontrar una función que haga eso en la documentación de Django .
Puede usar el filtro de expresiones regulares de Django.
https://docs.djangoproject.com/en/4.0/ref/models/querysets/#regex
Puedes probar este o similar a este
Model.object.filter(path__regex=r'\w*\\w{2}')Pruebe diferentes patrones de expresiones regulares
Esto debería ser posible reemplazando todas las apariciones del carácter que estamos buscando con una cadena en blanco, encontrando la longitud con los caracteres reemplazados y restándola de la longitud original.
from django.db.models.functions import Replace, Length from django.db.models import Value Model.objects.annotate(depth=Length('path') - Length(Replace('path', Value('/')))).filter(depth__lt=2 + 1)