Mysql
 sql >> Base de données >  >> RDS >> Mysql

possible de filtrer le jeu de requêtes après l'interrogation ? Django

Oui, vous pouvez réutiliser les ensembles de requêtes existants.

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

Cela n'accélère pas vraiment quoi que ce soit, en fait, ce bloc de code n'exécutera même pas de requête sur la base de données car les QuerySets de Django sont évalués paresseusement. Ce que je veux dire, c'est qu'il n'enverra pas la requête à la base de données tant que vous n'aurez pas réellement besoin des valeurs. Voici un exemple qui parlera à la base de données.

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)

Recommander la lecture :

En plus de cette réponse, vous pouvez faire une seule requête, puis filtrer en Python si vous le souhaitez vraiment. Attention, vous ne pouvez pas effectuer de filtrage ultérieur sur les listes car ce ne sont pas des 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))

Dans ce dernier exemple, everyone est un ensemble de requêtes et active_not_deleted et active_is_deleted sont des listes Python d'objets utilisateur. Le everyone queryset ne sera évalué qu'une seule fois dans la première list(everyone) appel, puis les résultats sont mis en cache.