Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

mungkinkah memfilter kumpulan kueri setelah kueri? django

Ya, Anda dapat menggunakan kembali kumpulan kueri yang ada.

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

Ini tidak benar-benar membuat sesuatu lebih cepat meskipun, kenyataannya, blok kode ini bahkan tidak akan mengeksekusi kueri terhadap database karena Django QuerySets dievaluasi dengan malas. Maksud saya adalah itu tidak akan mengirim kueri ke database sampai Anda benar-benar membutuhkan nilainya. Berikut adalah contoh yang akan berbicara dengan database.

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)

Rekomendasikan membaca:

Sebagai tambahan untuk jawaban ini, Anda dapat membuat satu kueri dan kemudian memfilter dengan Python jika Anda benar-benar menginginkannya. Ingat, Anda tidak dapat melakukan pemfilteran berikutnya pada daftar karena daftar tersebut bukan 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))

Dalam contoh terakhir ini, everyone adalah kumpulan kueri, dan active_not_deleted dan active_is_deleted adalah daftar Python dari objek Pengguna. everyone queryset hanya akan dievaluasi sekali dalam list(everyone) pertama panggilan, lalu hasilnya di-cache.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Permintaan lambat setelah memutakhirkan mysql dari 5,5 ke 5,6

  2. Jumlahkan hasil dari beberapa kueri lalu temukan 5 teratas di SQL

  3. Cara membuat batas offset dinamis hanya menggunakan (Saya) SQL

  4. Mysql2::Error:Akses ditolak untuk pengguna 'test'@'localhost' ke database 'depot_test'

  5. Tanggal saat ini dalam klausa MySQL WHERE