Sì, puoi riutilizzare i set di query esistenti.
everyone = User.objects.filter(is_active=True)
active_not_deleted = everyone.filter(is_deleted=False)
active_is_deleted = everyone.filter(is_deleted=True)
Questo non sta davvero rendendo nulla più veloce, tuttavia, in effetti, questo blocco di codice non eseguirà nemmeno una query sul database perché i QuerySet di Django vengono valutati pigramente. Quello che voglio dire è che non invierà la query al database finché non avrai effettivamente bisogno dei valori. Ecco un esempio che parlerà al database.
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)
Consiglio la lettura:
- https://docs.djangoproject .com/en/1.11/topics/db/queries/#querysets-are-lazy
- https://docs.djangoproject.com/en /1.11/ref/models/querysets/#iterator
- https://docs.djangoproject .com/en/1.11/topics/db/queries/#caching-and-querysets
In aggiunta a questa risposta, puoi fare una singola query e quindi filtrare in Python se lo desideri. Intendiamoci, non è possibile eseguire filtri successivi sugli elenchi perché non sono QuerySet.
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))
In quest'ultimo esempio, everyone
è un set di query e active_not_deleted
e active_is_deleted
sono elenchi Python di oggetti Utente. I everyone
queryset verrà valutato solo una volta nel primo list(everyone)
chiamata, quindi i risultati vengono memorizzati nella cache.