জ্যাঙ্গো ক্যোয়ারিতে "লাইক" সমতুল্য s


114

জাঙ্গোতে এই এসকিউএল বিবৃতিটির সমতুল্য কী?

SELECT * FROM table_name WHERE string LIKE pattern;

আমি কীভাবে এটি জাঙ্গোতে বাস্তবায়ন করব? আমি চেষ্টা করেছিলাম

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

তবে তা কার্যকর হয়নি। আমি কীভাবে এটি বাস্তবায়ন করব?

উত্তর:


211

ব্যবহার __containsবা __icontains(কেস-সংবেদনশীল):

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

এসকিউএল সমতুল্য

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

22
এবং ক্ষেত্রে সংবেদনশীল অনুসন্ধানের জন্য __icontains ->result = table.objects.filter(string__icontains='pattern')
হিতেশ গার্গ

14
এই উত্তরটি কেবল সম্ভাব্য প্যাটার্নগুলির একটি উপসেট আচ্ছাদন করে। এটি এমন কোনও প্যাটার্নটি পরিচালনা করবে না %a%b%
ক্যাস্পার্ড

@ ক্যাস্পার্ড, চেষ্টা করুন:result = table.objects.filter(string__contains='a').filter(string__contains='b')
মিঃ ল্যান্স ই স্লোয়ান

4
@ এলএস এটি মিলবে না baযা LIKE %a%b%মিলবে না।
ক্যাস্পার্ড

4
এই উত্তরটি উপরে বর্ণিত কারণে অসম্পূর্ণ। এটি @ দিমিত্রি এর উত্তরে তথ্য অন্তর্ভুক্ত করা উচিত।
medley56

34

ফ্যালসেট্রু দ্বারা উল্লিখিত আইকনটেনগুলি পছন্দ করে তোলে 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')

ক্ষেত্রের স্ট্রিংয়ের ক্ষেত্রে সংবেদনশীল অনুসন্ধান।


4
দুর্দান্ত, তবে একই উত্তর প্রায় তিন বছর আগে ইতিমধ্যে দেওয়া হয়েছিল।
মিঃ ল্যান্স ই স্লোয়ান

4

এটি জ্যাঙ্গোর কাস্টম লুকআপের সাহায্যে করা যেতে পারে । আমি ল্যাঙ্গুয়েজটিকে জ্যাঙ্গোর মতো-দৃষ্টিভঙ্গি অ্যাপ্লিকেশন হিসাবে তৈরি করেছি । এটি ইনস্টল করার পরে এবং ওয়াইল্ডকার্ডগুলির __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

এটি হ'ল গৃহীত উত্তরের মতো, প্রশ্নের সঠিক উত্তর।
লুটজ প্রিচেল্ট

3

বর্গের মতো শব্দের ক্রম সংরক্ষণ করার জন্য '% প্যাটার্ন%' বিবৃতিতে আমি আইরেজেক্স ব্যবহার করি, উদাহরণস্বরূপ:

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

স্ট্রিং পদ্ধতিগুলি অপরিবর্তনীয় তাই আপনার প্যাটার্নের চলকটি পরিবর্তন হবে না এবং এর সাথে * you'll আপনি কোনও বর্ণের 0 বা ততোধিক ঘটনা আবিষ্কার করবেন তবে ব্রেক লাইনগুলি।

নিদর্শন শব্দের সাথে পুনরাবৃত্তি করতে নিম্নলিখিতটি ব্যবহার করে:

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

আপনার প্যাটার্নে শব্দের ক্রম সংরক্ষণ করা হবে না, এমন কিছু লোকের জন্য যা কাজ করতে পারে তবে ক্ষেত্রে বর্গের মতো বর্গের নকল করার চেষ্টা করার ক্ষেত্রে আমি প্রথম বিকল্পটি ব্যবহার করব।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.