sql “LIKE” tương đương trong truy vấn django


108

Tương đương với câu lệnh SQL này trong django là gì?

SELECT * FROM table_name WHERE string LIKE pattern;

Làm cách nào để thực hiện điều này trong django? Tôi đã thử

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

Nhưng điều đó đã không hoạt động. Làm cách nào để thực hiện điều này?

Câu trả lời:


200

Sử dụng __containshoặc __icontains(không phân biệt chữ hoa chữ thường):

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

SQL tương đương là

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

22
Và đối với trường hợp không nhạy cảm sử dụng tìm kiếm __icontains ->result = table.objects.filter(string__icontains='pattern')
Hitesh Garg

13
Câu trả lời này chỉ bao gồm một tập hợp con của các mẫu có thể. Nó sẽ không xử lý một mô hình như thế nào %a%b%.
kasperd

@kasperd, hãy thử:result = table.objects.filter(string__contains='a').filter(string__contains='b')
LS

1
@LS Điều đó sẽ phù hợp với bađiều LIKE %a%b%sẽ không.
kasperd

2
Câu trả lời này không đầy đủ vì những lý do đã nêu ở trên. Nó cũng nên bao gồm thông tin trong câu trả lời của @ Dmitry.
medley56

34

chứa và icontains được đề cập bởi falsetru thực hiện các truy vấn như SELECT ... WHERE headline LIKE '%pattern%

Cùng với chúng, bạn có thể cần những cái này có hành vi tương tự: startwith , istartswith , endwith , iendswith

chế tạo

SELECT ... WHERE headline LIKE 'pattern%

hoặc là

SELECT ... WHERE headline LIKE '%pattern


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

Tìm kiếm không phân biệt chữ hoa chữ thường cho chuỗi trong một trường.


2
Tốt, nhưng câu trả lời tương tự đã được đưa ra gần ba năm trước đó.
LS

3

Để duy trì thứ tự của các từ như trong câu lệnh sql LIKE '% pattern%', tôi sử dụng iregex, ví dụ:

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

các phương thức chuỗi là bất biến vì vậy biến mẫu của bạn sẽ không thay đổi và với. * bạn sẽ tìm kiếm 0 hoặc nhiều lần xuất hiện của bất kỳ ký tự nào trừ các dòng ngắt.

Bằng cách sử dụng phần sau để lặp lại các từ mẫu:

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

Thứ tự của các từ trong mẫu của bạn sẽ không được giữ nguyên, đối với một số người có thể hoạt động nhưng trong trường hợp cố gắng bắt chước câu lệnh sql like, tôi sẽ sử dụng tùy chọn đầu tiên.


2

Điều này có thể được thực hiện với các tra cứu tùy chỉnh của Django . Tôi đã thực hiện tra cứu vào một ứng dụng tra cứu giống Django . Sau khi cài đặt nó, __liketra cứu với ký tự đại diện %_sẽ được kích hoạt.

Tất cả mã cần thiết trong ứng dụng là:

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
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.