Làm cách nào tôi có thể lọc truy vấn Django với danh sách các giá trị?


290

Tôi chắc chắn đây là một hoạt động tầm thường, nhưng tôi không thể hiểu nó đã được thực hiện như thế nào.

Phải có một cái gì đó thông minh hơn thế này:

ids = [1, 3, 6, 7, 9]

for id in ids:
    MyModel.objects.filter(pk=id)

Tôi đang tìm cách để có được tất cả chúng trong một truy vấn với một cái gì đó như:

MyModel.objects.filter(pk=[1, 3, 6, 7, 9])

Làm cách nào tôi có thể lọc truy vấn Django với danh sách các giá trị?



Câu trả lời:


538

Từ tài liệu Django :

Blog.objects.filter(pk__in=[1, 4, 7])

nó sẽ tăng lỗi nếu chúng ta vượt qua danh sách trống hoặc trả lại không có bản ghi?
Rakmo

@OmkarDeshpande Không
DylanYoung

@DylanYoung Vì vậy, nó sẽ không trả lại kỷ lục
Rakmo

2
@OmkarDeshpande Chính xác. Mặc dù, nếu bạn gọi get(), bạn sẽ gặp lỗi ObjectDoesNotExist.
DylanYoung

48

Khi bạn có danh sách các mục và bạn muốn kiểm tra các giá trị có thể có từ danh sách thì bạn không thể sử dụng =.

Truy vấn sql sẽ giống như SELECT * FROM mytable WHERE ids=[1, 3, 6, 7, 9]không đúng. Bạn phải sử dụng intoán tử cho điều này để bạn truy vấn sẽ giống như toán tử SELECT * FROM mytable WHERE ids in (1, 3, 6, 7, 9)cung cấp Django __in.


20
+1 cho một lời giải thích nhỏ. Mặc dù tôi biết tôi có thể đọc tài liệu, nhưng điều đó không nhất thiết có nghĩa là tôi hiểu tài liệu.
Austin A

6

Từ tài liệu Django :

Blog.objects.in_bulk([1])
{1: <Blog: Beatles Blog>}

Blog.objects.in_bulk([1, 2])
{1: <Blog: Beatles Blog>, 2: <Blog: Cheddar Talk>}

Blog.objects.in_bulk([])
{}

Blog.objects.in_bulk()
{1: <Blog: Beatles Blog>, 2: <Blog: Cheddar Talk>, 3: <Blog: Django Weblog>}

Blog.objects.in_bulk(['beatles_blog'], field_name='slug')
{'beatles_blog': <Blog: Beatles Blog>}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.