sql“ LIKE” เทียบเท่าในแบบสอบถาม django


114

คำสั่ง SQL นี้เทียบเท่ากับอะไรใน django?

SELECT * FROM table_name WHERE string LIKE pattern;

ฉันจะนำสิ่งนี้ไปใช้ใน django ได้อย่างไร ฉันเหนื่อย

result = table.objects.filter( pattern in string )

แต่นั่นไม่ได้ผล ฉันจะใช้สิ่งนี้ได้อย่างไร

คำตอบ:


210

ใช้__containsหรือ__icontains(ไม่คำนึงถึงขนาดตัวพิมพ์):

result = table.objects.filter(string__contains='pattern')

SQL ที่เทียบเท่าคือ

SELECT ... WHERE string LIKE '%pattern%';

22
และสำหรับการค้นหาแบบไม่คำนึงถึงตัวพิมพ์เล็กและใหญ่ให้ใช้__icontains ->result = table.objects.filter(string__icontains='pattern')
Hitesh Garg

14
คำตอบนี้ครอบคลุมเฉพาะส่วนย่อยของรูปแบบที่เป็นไปได้ %a%b%มันจะไม่จัดการกับรูปแบบเช่น
kasperd

@kasperd ลอง:result = table.objects.filter(string__contains='a').filter(string__contains='b')
Mr. Lance E Sloan

1
@LS นั่นจะตรงกับbaที่LIKE %a%b%จะไม่
kasperd

2
คำตอบนี้ไม่สมบูรณ์ด้วยเหตุผลที่ระบุไว้ข้างต้น ควรใส่ข้อมูลไว้ในคำตอบของ @ Dmitry ด้วย
medley56

34

มีและ icontains ที่กล่าวถึงโดย falsetru ทำให้แบบสอบถามเช่น SELECT ... WHERE headline LIKE '%pattern%

พร้อมกับพวกเขาคุณอาจต้องคนเหล่านี้มีพฤติกรรมที่คล้ายกัน: startswith , istartswith , endswith , iendswith

การทำ

SELECT ... WHERE headline LIKE 'pattern%

หรือ

SELECT ... WHERE headline LIKE '%pattern


9
result = table.objects.filter(string__icontains='pattern')

การค้นหาสตริงที่ไม่คำนึงถึงตัวพิมพ์เล็กและใหญ่ในฟิลด์


3
ดี แต่คำตอบเดียวกันนี้ได้รับมาแล้วเกือบสามปีก่อนหน้านี้
Mr. Lance E Sloan

4

ซึ่งสามารถทำได้ด้วยDjango ของการค้นหาที่กำหนดเอง ผมได้ทำการค้นหาเป็นแอพลิเคชัน Django เหมือนการค้นหา หลังจากติดตั้งแล้วการ__likeค้นหาด้วยสัญลักษณ์%และ_สัญลักษณ์จะเปิดใช้งาน

รหัสที่จำเป็นทั้งหมดในแอปพลิเคชันคือ:

from django.db.models import Lookup
from django.db.models.fields import Field


@Field.register_lookup
class Like(Lookup):
    lookup_name = 'like'

    def as_sql(self, compiler, connection):
        lhs, lhs_params = self.process_lhs(compiler, connection)
        rhs, rhs_params = self.process_rhs(compiler, connection)
        params = lhs_params + rhs_params
        return '%s LIKE %s' % (lhs, rhs), params

นี่คือคำตอบที่เหมาะสมสำหรับคำถามซึ่งแตกต่างจากคำตอบที่ยอมรับ
Lutz Prechelt

3

เพื่อรักษาลำดับของคำในคำสั่ง sql LIKE '% pattern%' ฉันใช้ iregex ตัวอย่างเช่น:

qs = table.objects.filter(string__iregex=pattern.replace(' ', '.*'))

วิธีการสตริงไม่เปลี่ยนรูปดังนั้นตัวแปรรูปแบบของคุณจะไม่เปลี่ยนแปลงและด้วย * คุณจะมองหาอักขระใด ๆ ที่เกิดขึ้น 0 ครั้งขึ้นไปยกเว้นเส้นแบ่ง

โดยใช้สิ่งต่อไปนี้เพื่อวนซ้ำคำรูปแบบ:

qs = table.objects
for word in pattern.split(' '):
    qs = qs.filter(string__icontains=word)

ลำดับของคำในรูปแบบของคุณจะไม่ถูกเก็บรักษาไว้สำหรับบางคนที่สามารถใช้งานได้ แต่ในกรณีที่พยายามเลียนแบบคำสั่ง sql เช่นฉันจะใช้ตัวเลือกแรก

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