Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

có thể lọc bộ truy vấn sau khi truy vấn không? django

Có, bạn có thể sử dụng lại các bộ truy vấn hiện có.

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

Tuy nhiên, điều này không thực sự làm cho mọi thứ nhanh hơn, trên thực tế, khối mã này thậm chí sẽ không thực hiện một truy vấn đối với cơ sở dữ liệu vì Django QuerySets được đánh giá một cách lười biếng. Ý tôi là nó sẽ không gửi truy vấn đến cơ sở dữ liệu cho đến khi bạn thực sự cần các giá trị. Đây là một ví dụ sẽ nói chuyện với cơ sở dữ liệu.

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)

Khuyến nghị đọc:

Như một phần bổ sung cho câu trả lời này, bạn có thể thực hiện một truy vấn và sau đó lọc bằng Python nếu bạn thực sự muốn. Xin lưu ý, bạn không thể thực hiện lọc tiếp theo trên danh sách vì chúng không phải là 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))

Trong ví dụ cuối cùng này, everyone là một bộ truy vấn và active_not_deletedactive_is_deleted là danh sách Python của các đối tượng Người dùng. everyone queryset sẽ chỉ được đánh giá một lần trong danh sách list(everyone) gọi, và sau đó kết quả được lưu vào bộ nhớ đệm.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. làm thế nào để truy vấn nhiều-nhiều?

  2. Thiết kế các sự kiện ngày-giờ không trùng lặp

  3. Thứ tự Laravel theo mối quan hệ hasmany

  4. Nối các bản ghi trong một cột duy nhất mà không lặp lại?

  5. Lấy dữ liệu từ mysql sang StreamBuilder Flutter