sql "LIKE" django क्वेरी के बराबर है


108

Django में इस SQL ​​स्टेटमेंट के बराबर क्या है?

SELECT * FROM table_name WHERE string LIKE pattern;

मैं इसे django में कैसे लागू करूं? मैंने कोशिश की

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

लेकिन वह काम नहीं आया। मैं इसे कैसे क्रियान्वित करूं?

जवाबों:


200

उपयोग ( __containsया __icontainsअसंवेदनशील):

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

एसक्यूएल समकक्ष है

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

22
और मामले के लिए असंवेदनशील खोज उपयोग __icontains ->result = table.objects.filter(string__icontains='pattern')
हितेश गर्ग

13
यह उत्तर केवल संभावित प्रतिमानों के सबसेट को कवर करता है। यह जैसे पैटर्न को हैंडल नहीं करेगा %a%b%
कास्परड

@kasperd, कोशिश करें:result = table.objects.filter(string__contains='a').filter(string__contains='b')
एलएस

1
@ एलएस मैच होगा baजो LIKE %a%b%नहीं होगा।
कास्परड

2
उपरोक्त कारणों से यह उत्तर अधूरा है। इसमें @ दिमित्री के उत्तर में जानकारी भी शामिल होनी चाहिए।
medley56

34

इसमें शामिल हैं और गलत तरीके से बताए गए आइकॉन जैसे प्रश्न बनाते हैं SELECT ... WHERE headline LIKE '%pattern%

उनके साथ, आपको समान व्यवहार वाले इन लोगों की आवश्यकता हो सकती है: स्टार्टस्विथ , इस्टार्टस्विथ , एंड्सविथ , आइंडस्विथ

निर्माण

SELECT ... WHERE headline LIKE 'pattern%

या

SELECT ... WHERE headline LIKE '%pattern


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

एक क्षेत्र में स्ट्रिंग के लिए असंवेदनशील खोज।


2
अच्छा लगा, लेकिन लगभग तीन साल पहले ही इसका जवाब दिया जा चुका था।
एलएस

3

उदाहरण के लिए, मैं iregex का उपयोग करने वाले sql LIKE '% pattern%' कथन में शब्दों के क्रम को संरक्षित करने के लिए,

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

स्ट्रिंग विधियाँ अपरिवर्तनीय हैं, इसलिए आपका पैटर्न वैरिएबल नहीं बदलेगा और उसके साथ। * आप किसी भी वर्ण के 0 या अधिक आवृत्तियों की खोज करेंगे, लेकिन लाइनों को तोड़ेंगे।

पैटर्न शब्दों पर पुनरावृति के लिए निम्नलिखित का उपयोग करके:

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

आपके पैटर्न में शब्दों के क्रम को संरक्षित नहीं किया जाएगा, कुछ लोगों के लिए जो काम कर सकते हैं, लेकिन मैं पहले विकल्प का उपयोग करने वाले कथन जैसे sql की नकल करने की कोशिश करूंगा।


2

यह 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
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.