Leí los documentos de Querysets Django sobre querysets son perezosos, pero todavía estoy un poco confundido aquí.
Entonces, en mi opinión, configuré un conjunto de consultas para una variable como esa
players = Players.objects.filter(team=team)Más tarde, tengo un mecanismo de clasificación que puedo aplicar
sort = '-player_last_name' if pts > 20: players = players.filter(pts__gte = pts).order_by(sort) else: players = players.filter(pts__lte = pts).order_by(sort) if ast < 5: players = players.filter(asts__lte = ast).order_by(sort) else: players = players.filter(asts__gte = ast).order_by(sort) context = {players: players) return render(request, '2021-2022/allstars.html', context)Lo que quiero saber es, ¿cuándo se evalúa el conjunto de consultas de los jugadores? ¿Es cuando se representa cada página o cada vez que asigno el conjunto de consultas a una variable? Porque si es lo primero, entonces solo puedo aplicar la cadena .order_by(sort) y las aplicaciones anteriores son redundantes.
QuerySet se evalúan si " consume " el conjunto de consultas. Usted consume un conjunto de consultas enumerando sobre él, llame a.get(…) , .exists(…) , .aggregate(…) o .count(…) , verifique la veracidad (por ejemplo con if myqueryset: o bool(queryset) , o llame a len(…) sobre él, etc. Como regla general, se evalúa si realiza una acción en él de modo que el resultado ya no sea un QuerySet .
Si enumera sobre él o llama a len(…) el resultado se almacena en caché en el QuerySet , por lo que llamarlo por segunda vez o enumerarlo después de haber llamado a len(…) no hará otro viaje a la base de datos.
En este caso específico, ninguno de los QuerySet se evalúa antes de realizar la llamada a la función render(…) . Si en la plantilla, por ejemplo, usa {% if players %} , o {% for players %} , {{ players|length }} , o {{ players.exists }} , entonces evaluará el conjunto de consultas.
Las consultas de Django están diseñadas para ser "perezosas", es decir. no ejecutan la consulta de la base de datos hasta que algo solicita datos reales. Las consultas se pueden modificar mediante la adición de filtrado y otras funciones similares.
Por ejemplo, el siguiente código solicita todos los objetos TeamMember cuando la cadena de búsqueda es 'all' , pero de lo contrario agrega un filtro para restringir los nombres a aquellos que coincidan con la búsqueda dada.
squad_list = TeamMember.objects(state__in={"Hired", "Joined", "Staff", "Recruiting"}) if squadname != 'all': squad_list = squad_list(squad__icontains=squadname.lower()) Cuando la consulta de la lista de squadlist finalmente se ejecute, recuperará el registro requerido. Dopes esta ayuda?