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

muligt at filtrere forespørgselssættet efter forespørgsel? django

Ja, du kan genbruge eksisterende forespørgselssæt.

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

Dette gør ikke rigtig noget hurtigere, men i virkeligheden vil denne kodeblok ikke engang udføre en forespørgsel mod databasen, fordi Django QuerySets bliver dovent evalueret. Hvad jeg mener er, at den ikke sender forespørgslen til databasen, før du rent faktisk har brug for værdierne. Her er et eksempel, der vil tale til databasen.

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)

Anbefal at læse:

Som en tilføjelse til dette svar kunne du lave en enkelt forespørgsel og derefter filtrere i Python, hvis du virkelig ville. Husk at du ikke kunne foretage efterfølgende filtrering på listerne, fordi de ikke er 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))

I dette sidste eksempel, everyone er et forespørgselssæt og active_not_deleted og active_is_deleted er Python-lister over brugerobjekter. everyone queryset vil kun blive evalueret én gang i den første list(everyone) opkald, og derefter cachelagres resultaterne.



  1. Hvordan forbinder man mysql workbench til at køre mysql inde i docker?

  2. IDLE timeout parameter i Oracle

  3. Er det sikkert at bruge LIMIT uden ORDER BY

  4. ufuldstændig information fra forespørgsel på pg_views