sql >> Base de Datos >  >> RDS >> Mysql

¿Es posible filtrar el conjunto de consultas después de consultar? Django

Sí, puede reutilizar conjuntos de consultas existentes.

everyone = User.objects.filter(is_active=True)
active_not_deleted = everyone.filter(is_deleted=False)
active_is_deleted = everyone.filter(is_deleted=True)

Sin embargo, esto realmente no está haciendo nada más rápido, de hecho, este bloque de código ni siquiera ejecutará una consulta en la base de datos porque los Django QuerySets se evalúan con pereza. Lo que quiero decir es que no enviará la consulta a la base de datos hasta que realmente necesite los valores. Aquí hay un ejemplo que hablará con la base de datos.

everyone = User.objects.filter(is_active=True)  # Building SQL...
active_not_deleted = everyone.filter(is_deleted=False)  # Building SQL...
active_is_deleted = everyone.filter(is_deleted=True)  # Building SQL...

# Example of the whole queryset being evaluated
for user in everyone:
    # This will execute the query against the database to return the list of users
    # i.e. "select * from user where is_active is True;"
    print(user)

# Example of using iterator to evaluate one object at a time from the queryset.
for user in active_not_deleted.iterator():
    # This will execute the query for each result, so it doesn't
    # load everything at once and it doesn't cache the results.
    # "select * from user where is_active is True and is_deleted is False limit 1 offset 0;"
    # The offset is incremented on each loop and another query is sent to retrieve the next user in the list.
    print(user)

Recomendar lectura:

Como complemento a esta respuesta, puede realizar una sola consulta y luego filtrar en Python si realmente lo desea. Eso sí, no podría hacer un filtrado posterior en las listas porque no son QuerySets.

everyone = User.objects.filter(is_active=True)
active_not_deleted = list(filter(lambda user: user.is_deleted is False), list(everyone))
active_is_deleted = list(filter(lambda user: user.is_deleted is True), list(everyone))

En este último ejemplo, everyone es un conjunto de consultas y active_not_deleted y active_is_deleted son listas de Python de objetos de usuario. Los everyone queryset solo se evaluará una vez en la primera list(everyone) llamada, y luego los resultados se almacenan en caché.