Mysql
 sql >> Datenbank >  >> RDS >> Mysql

möglich, das Abfrageset nach der Abfrage zu filtern? Django

Ja, Sie können vorhandene Abfragesätze wiederverwenden.

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

Dies beschleunigt jedoch nicht wirklich etwas, tatsächlich führt dieser Codeblock nicht einmal eine Abfrage für die Datenbank aus, da Django-Abfragesätze träge ausgewertet werden. Was ich meine, ist, dass die Abfrage erst dann an die Datenbank gesendet wird, wenn Sie die Werte tatsächlich benötigen. Hier ist ein Beispiel, das mit der Datenbank kommuniziert.

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)

Leseempfehlung:

Als Ergänzung zu dieser Antwort können Sie eine einzelne Abfrage erstellen und dann in Python filtern, wenn Sie dies wirklich möchten. Wohlgemerkt, Sie konnten die Listen nicht nachträglich filtern, da es sich nicht um QuerySets handelt.

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 diesem letzten Beispiel everyone ist ein Abfragesatz und active_not_deleted und active_is_deleted sind Python-Listen von Benutzerobjekten. Der everyone queryset wird nur einmal in der ersten list(everyone) ausgewertet aufrufen, und dann werden die Ergebnisse zwischengespeichert.