sql setara "LIKE" dalam permintaan django

108

Apa padanan pernyataan SQL ini di django?

SELECT * FROM table_name WHERE string LIKE pattern;

Bagaimana cara mengimplementasikan ini di django? Saya mencoba

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

Tapi itu tidak berhasil. Bagaimana cara menerapkan ini?

Aswin Murugesh
sumber

Jawaban:

200

Gunakan __containsatau __icontains(case-insensitive):

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

Setara SQL adalah

SELECT ... WHERE string LIKE '%pattern%';
falsetru.dll
sumber
22
Dan untuk penelusuran tidak peka huruf besar / kecil, gunakan __icontains ->result = table.objects.filter(string__icontains='pattern')
Hitesh Garg
13
Jawaban ini hanya mencakup sebagian dari pola yang mungkin. Itu tidak akan menangani pola seperti itu %a%b%.
kasperd
@kasperd, coba:result = table.objects.filter(string__contains='a').filter(string__contains='b')
LS
1
@LS Itu akan cocok dengan bamana yang LIKE %a%b%tidak.
kasperd
2
Jawaban ini tidak lengkap karena alasan yang disebutkan di atas. Ini juga harus menyertakan informasi dalam jawaban @ Dmitry.
medley56
34

berisi dan isi yang disebutkan oleh falsetru membuat kueri seperti SELECT ... WHERE headline LIKE '%pattern%

Bersamaan dengan mereka, Anda mungkin memerlukan yang berikut ini dengan perilaku serupa: startswith , istartswith , endswith , iendswith

pembuatan

SELECT ... WHERE headline LIKE 'pattern%

atau

SELECT ... WHERE headline LIKE '%pattern

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

Pencarian tidak peka huruf besar / kecil untuk string dalam bidang.

Venkat Kotra
sumber
2
Bagus, tapi jawaban yang sama sudah diberikan hampir tiga tahun sebelumnya.
LS
3

Untuk menjaga urutan kata-kata seperti dalam pernyataan sql LIKE '% pattern%' saya menggunakan iregex, misalnya:

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

metode string tidak dapat diubah sehingga variabel pola Anda tidak akan berubah dan dengan. * Anda akan mencari 0 atau lebih kemunculan karakter apa pun kecuali garis putus.

Dengan menggunakan yang berikut ini untuk mengulangi kata-kata pola:

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

urutan kata-kata dalam pola Anda tidak akan dipertahankan, untuk beberapa orang yang bisa bekerja tetapi dalam kasus mencoba meniru pernyataan seperti sql saya akan menggunakan opsi pertama.

Rodrigo Ávila
sumber
2

Ini bisa dilakukan dengan pencarian kustom Django . Saya telah membuat pencarian menjadi aplikasi pencarian mirip-Django . Setelah menginstalnya, __likepencarian dengan wildcard %dan _akan diaktifkan.

Semua kode yang diperlukan dalam aplikasi ini adalah:

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
Petr Dlouhý
sumber