ฉันจะกรองเคียวรี Django ด้วยรายการค่าได้อย่างไร


291

ฉันแน่ใจว่านี่เป็นการดำเนินการที่ไม่สำคัญ แต่ฉันไม่สามารถทราบได้ว่ามันเสร็จสิ้นแล้ว

จะต้องมีสิ่งที่ฉลาดกว่านี้:

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

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

ฉันต้องการให้พวกเขาทั้งหมดในแบบสอบถามเดียวกับสิ่งที่ชอบ:

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

ฉันจะกรองเคียวรี Django ด้วยรายการค่าได้อย่างไร



คำตอบ:


539

จากเอกสาร Django :

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

มันจะเพิ่มข้อผิดพลาดหรือไม่ถ้าเราส่งรายการว่างหรือไม่ส่งคืนบันทึก
Rakmo

@OmkarDeshpande No
DylanYoung

@DylanYoung ดังนั้นมันจะไม่ส่งคืนบันทึกใด ๆ
Rakmo

2
@OmkarDeshpande อย่างแน่นอน แม้ว่าถ้าคุณโทรget()คุณจะได้รับข้อผิดพลาด ObjectDoesNotExist แน่นอน
DylanYoung

48

=เมื่อคุณมีรายชื่อของรายการและคุณต้องการที่จะตรวจสอบค่าที่เป็นไปได้จากรายการแล้วคุณจะไม่สามารถใช้

แบบสอบถาม SQL จะเป็นเช่นSELECT * FROM mytable WHERE ids=[1, 3, 6, 7, 9]นั้นไม่เป็นความจริง คุณต้องใช้inโอเปอเรเตอร์สำหรับสิ่งนี้เพื่อที่คุณจะได้สอบถามSELECT * FROM mytable WHERE ids in (1, 3, 6, 7, 9)ว่า Django เป็น__inผู้ให้บริการหรือไม่


20
+1 สำหรับคำอธิบายเล็ก ๆ แม้ว่าฉันจะรู้ว่าฉันสามารถอ่านเอกสารได้ แต่นั่นไม่ได้แปลว่าฉันเข้าใจเอกสารนั้น
Austin A

6

จากเอกสาร 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>}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.