Mysql
 sql >> база данни >  >> RDS >> Mysql

възможно ли е да филтрирате набора от заявки след заявка? django

Да, можете да използвате повторно съществуващи набори от заявки.

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

Това всъщност не прави нищо по-бързо, но всъщност този блок с код дори няма да изпълни заявка към базата данни, защото Django QuerySets се оценява мързеливо. Това, което имам предвид, е, че няма да изпрати заявката към базата данни, докато действително не се нуждаете от стойностите. Ето пример, който ще говори с базата данни.

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)

Препоръчително четене:

Като допълнение към този отговор можете да направите една заявка и след това да филтрирате в Python, ако наистина искате. Имайте предвид, че не можете да направите последващо филтриране на списъците, защото те не са 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))

В този последен пример everyone е набор от заявки и active_not_deleted и active_is_deleted са списъци на Python с потребителски обекти. everyone queryset ще бъде оценен само веднъж в първия list(everyone) извикване и след това резултатите се кешират.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MySQL - Модел на списък на съседство - Получаване на дълбочина

  2. Как да генерирам 5 произволни числа в съхранената процедура на mysql

  3. MySQL GROUP BY...HVING различни стойности едно и също поле

  4. Laravel Crypt - Сравняване на стойности

  5. MySQL:Потърсете един и същ низ в множество колони