sql >> Databáze >  >> RDS >> Mysql

je možné filtrovat sadu dotazů po dotazu? django

Ano, existující sady dotazů můžete znovu použít.

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

To ve skutečnosti nic nezrychluje, i když ve skutečnosti tento blok kódu ani neprovede dotaz na databázi, protože Django QuerySets jsou líně vyhodnocovány. Mám na mysli, že neodešle dotaz do databáze, dokud hodnoty skutečně nepotřebujete. Zde je příklad, který bude mluvit s databází.

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)

Doporučuji přečíst:

Jako doplněk k této odpovědi můžete vytvořit jeden dotaz a poté filtrovat v Pythonu, pokud opravdu chcete. Uvědomte si, že jste nemohli provést následné filtrování seznamů, protože to nejsou 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))

V tomto posledním příkladu everyone je sada dotazů a active_not_deleted a active_is_deleted jsou Python seznamy objektů uživatele. everyone sada dotazů bude vyhodnocena pouze jednou v prvním list(everyone) volání a poté jsou výsledky uloženy do mezipaměti.



  1. Jak importovat soubor .bak SQL Serveru do MySQL?

  2. Uchovávejte informace o účtu ve všech činnostech v android studiu

  3. Nelze zmenšit databázi „pouze pro čtení“ | Zmenšit protokol transakcí při používání skupiny dostupnosti AlwaysOn

  4. SQLSTATE[HY000]:Obecná chyba:1298 Neznámé nebo nesprávné časové pásmo:okna 'UTC'