Mysql
 sql >> Database >  >> RDS >> Mysql

possibile filtrare il set di query dopo l'interrogazione? django

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:

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.