Ja, du kan återanvända befintliga frågeuppsättningar.
everyone = User.objects.filter(is_active=True)
active_not_deleted = everyone.filter(is_deleted=False)
active_is_deleted = everyone.filter(is_deleted=True)
Detta gör egentligen ingenting snabbare, men i själva verket kommer detta kodblock inte ens att köra en fråga mot databasen eftersom Django QuerySets utvärderas lätt. Vad jag menar är att den inte skickar frågan till databasen förrän du verkligen behöver värdena. Här är ett exempel som kommer att prata med 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)
Rekommenderar läsning:
- 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
Som ett tillägg till detta svar kan du göra en enda fråga och sedan filtrera i Python om du verkligen vill. Tänk på att du inte kunde göra efterföljande filtrering på listorna eftersom de inte är 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 det här sista exemplet, everyone
är en frågeuppsättning och active_not_deleted
och active_is_deleted
är Python-listor över användarobjekt. everyone
queryset kommer bara att utvärderas en gång i den första list(everyone)
anrop och sedan cachelagras resultaten.