คำสั่ง SQL นี้เทียบเท่ากับอะไรใน django?
SELECT * FROM table_name WHERE string LIKE pattern;
ฉันจะนำสิ่งนี้ไปใช้ใน django ได้อย่างไร ฉันเหนื่อย
result = table.objects.filter( pattern in string )
แต่นั่นไม่ได้ผล ฉันจะใช้สิ่งนี้ได้อย่างไร
คำสั่ง SQL นี้เทียบเท่ากับอะไรใน django?
SELECT * FROM table_name WHERE string LIKE pattern;
ฉันจะนำสิ่งนี้ไปใช้ใน django ได้อย่างไร ฉันเหนื่อย
result = table.objects.filter( pattern in string )
แต่นั่นไม่ได้ผล ฉันจะใช้สิ่งนี้ได้อย่างไร
คำตอบ:
ใช้__contains
หรือ__icontains
(ไม่คำนึงถึงขนาดตัวพิมพ์):
result = table.objects.filter(string__contains='pattern')
SQL ที่เทียบเท่าคือ
SELECT ... WHERE string LIKE '%pattern%';
%a%b%
มันจะไม่จัดการกับรูปแบบเช่น
result = table.objects.filter(string__contains='a').filter(string__contains='b')
ba
ที่LIKE %a%b%
จะไม่
มีและ icontains ที่กล่าวถึงโดย falsetru ทำให้แบบสอบถามเช่น SELECT ... WHERE headline LIKE '%pattern%
พร้อมกับพวกเขาคุณอาจต้องคนเหล่านี้มีพฤติกรรมที่คล้ายกัน: startswith , istartswith , endswith , iendswith
การทำ
SELECT ... WHERE headline LIKE 'pattern%
หรือ
SELECT ... WHERE headline LIKE '%pattern
result = table.objects.filter(string__icontains='pattern')
การค้นหาสตริงที่ไม่คำนึงถึงตัวพิมพ์เล็กและใหญ่ในฟิลด์
ซึ่งสามารถทำได้ด้วย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
เพื่อรักษาลำดับของคำในคำสั่ง 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 เช่นฉันจะใช้ตัวเลือกแรก
result = table.objects.filter(string__icontains='pattern')