sql >> Database >  >> RDS >> Mysql

mogelijk om de queryset te filteren na het opvragen? django

Ja, u kunt bestaande querysets hergebruiken.

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

Dit maakt echter niet echt iets sneller, in feite zal dit codeblok zelfs geen query uitvoeren op de database omdat Django QuerySets lui worden geëvalueerd. Wat ik bedoel is dat het de query niet naar de database zal sturen totdat je de waarden echt nodig hebt. Hier is een voorbeeld dat met de database praat.

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)

Aanbevelen om te lezen:

Als aanvulling op dit antwoord kun je een enkele query maken en vervolgens filteren in Python als je dat echt wilt. Let op, u kunt de lijsten niet later filteren omdat het geen QuerySets zijn.

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 dit laatste voorbeeld, everyone is een queryset, en active_not_deleted en active_is_deleted zijn Python-lijsten met gebruikersobjecten. De everyone queryset wordt slechts één keer geëvalueerd in de eerste list(everyone) oproep, en dan worden de resultaten in de cache opgeslagen.



  1. Mysql groeperen op twee kolommen en kies de maximale waarde van de derde kolom

  2. Kan ik een plpgsql-functie een geheel getal laten retourneren zonder een variabele te gebruiken?

  3. Hoe het aantal seconden na middernacht in Oracle Database te retourneren?

  4. Resultaten beperken in Oracle