জ্যাঙ্গো ক্যোয়ারসেট ফিল্টারিংয়ে আমি কীভাবে সমান না করব?


664

জাজানো মডেল ক্যোরিসেটসগুলিতে, আমি দেখতে পাচ্ছি যে তুলনামূলক মানগুলির জন্য একটি আছে __gtএবং __ltসেখানে একটি __ne/ !=/ <>( সমান নয় ?) রয়েছে

আমি একটি না সমান ব্যবহার করে ফিল্টার আউট করতে চাই:

উদাহরণ:

Model:
    bool a;
    int x;

আমি চাই

results = Model.objects.exclude(a=true, x!=5)

!=সঠিক বাক্য গঠন নয়। আমি চেষ্টা __ne, <>

আমি ব্যবহার করে শেষ করেছি:

results = Model.objects.exclude(a=true, x__lt=5).exclude(a=true, x__gt=5)

75
ফলাফল = মডেল.ওজেক্টস.এক্সক্লুয়েড (a = ট্রু)? ফিল্টার (x = 5) কাজ করেছে?
হুগডব্রাউন

3
@hughdbrown। না। আপনার ক্যোয়ারী a=trueপ্রথমে সমস্ত বাদ দেয় এবং তারপরে বাকীটিতে x=5ফিল্টারটি প্রয়োগ করে । অভিপ্রেত ক্যোয়ারী শুধুমাত্র যাদের প্রয়োজনীয় a=trueএবং x!=5। পার্থক্যটি হ'ল এটির সাথে a=trueএবং x=5সমস্তগুলি ফিল্টার আউটও।
মিচেল ভ্যান জুয়েলেন

উত্তর:


689

সম্ভবত কি সমস্যাগুলি এই সমস্যার জন্য সহায়ক হতে পারে। আমি এগুলি কখনও ব্যবহার করি নি তবে মনে হয় এগুলি সাধারণ অজগর অভিব্যক্তির মতোই উপেক্ষিত এবং একত্রিত হতে পারে।

আপডেট: আমি কেবল এটি চেষ্টা করেছি, মনে হচ্ছে এটি বেশ ভালভাবে কাজ করবে:

>>> from myapp.models import Entry
>>> from django.db.models import Q

>>> Entry.objects.filter(~Q(id = 3))

[<Entry: Entry object>, <Entry: Entry object>, <Entry: Entry object>, ...]

16
@ জেসিএলিটো: আরও স্বজ্ঞাত সিন্টেক্সের জন্য নীচে @ d4nt এর উত্তরও দেখুন
পল ডি ওয়েট

610

আপনার প্রশ্নের দ্বিগুণ নেতিবাচক বলে মনে হচ্ছে, আপনি x 5 নয় এমন সমস্ত সারি বাদ দিতে চান, সুতরাং অন্য কথায় আপনি সমস্ত সারি অন্তর্ভুক্ত করতে চান যেখানে x 5 রয়েছে I আমি বিশ্বাস করি এটি কৌশলটি করবে।

results = Model.objects.filter(x=5).exclude(a=true)

আপনার নির্দিষ্ট প্রশ্নের উত্তর দেওয়ার জন্য, কোনও "সমান নয়" তবে এটি সম্ভবত কারণ জাঙ্গোতে "ফিল্টার" এবং "বাদ দিন" উভয় পদ্ধতিই উপলব্ধ রয়েছে যাতে আপনি সর্বদা পছন্দসই ফলাফলটি পাওয়ার জন্য কেবল যুক্তিচক্রকে স্যুইচ করতে পারেন।


2
@ d4nt: আমি ভুল হতে পারি, তবে আমার মনে হয় ক্যোয়ারীটি হওয়া উচিতresults = Model.objects.filter(a=true).exclude(x=5)
তারানজিৎ

1
@ তরঞ্জিত: আমি মনে করি আপনি মূল প্রশ্নটি ভুলভাবে লিখেছেন। d4nt এর সংস্করণটি সঠিক, কারণ ওপি (a = সত্য) বাদ দিতে এবং x = 5 (যেমন এটি অন্তর্ভুক্ত করা) বাদ দেওয়ার উপকার করতে চেয়েছিল।
চাক

3
আমি মনে করি এটি ভুল কারণ একটি উদাহরণ (x = 4, a = মিথ্যা) ভুলভাবে বাদ দেওয়া হবে।
রেমকো গ্রিলিচ 14

4
পছন্দ করেছেন আমি কেবল এটি নিজে চেষ্টা করেছিলাম, excludeএবং filterআদেশগুলি এবং কলগুলি কোনও অর্থবহ পার্থক্য তৈরি করতে পারেনি। WHEREধারাটিতে শর্তগুলির ক্রম পরিবর্তিত হয়, তবে কীভাবে বিষয়টি আসে?
coredumperror

4
@ উদ্যানগোসাকে বাদ দেওয়া এবং ফিল্টার করার আদেশের বিষয়টি বিবেচনা করে না।
এরালপবি

132

field=valueপ্রশ্নের মধ্যে বাক্য গঠনটি একটি সংক্ষিপ্তকরণ field__exact=value। এর অর্থ এটি যে জাঙ্গো শনাক্তকারীদের ক্যোয়ারী ক্ষেত্রগুলিতে ক্যোয়ারী অপারেটরদের রাখে । জ্যাঙ্গো নিম্নলিখিত অপারেটরদের সমর্থন করে:

exact
iexact
contains
icontains
in
gt
gte
lt
lte
startswith
istartswith
endswith
iendswith
range
year
month
day
week_day
isnull
search
regex
iregex

ডেভ ভোগের পরামর্শ অনুসারে এবং জেসন বেকার যেমন ব্যবহার করেছেন filter()বা জেসন বেকার পরামর্শ দিয়েছেন তেমন কিউ অবজেক্টের সাথে এগুলিকে সংযুক্ত করে আমি নিশ্চিত যে কোনও সম্ভাব্য ক্যোয়ারীর জন্য আপনার যা প্রয়োজন ঠিক তা পেয়ে যাবেন।exclude()


ধন্যবাদ এটি দুর্দান্ত। আমি এই জাতীয় কিছু ব্যবহার করেছি tg=Tag.objects.filter(user=request.user).exclude(name__regex=r'^(public|url)$')এবং এটি কাজ করে।
সুহাইলস

@ সুহাইল, দয়া করে মনে রাখবেন যে সমস্ত ডাটাবেস সেই রেজেক্স সিনট্যাক্সকে সমর্থন করে না :)
আনয়েজ

2
আমি icontains, iexactএবং অনুরূপ স্ট্যান্ডস "কেস সংবেদনশীলতা উপেক্ষা করুন" এর জন্য। এটি "বিপরীত" জন্য নয়।
আইভী

এটি লক্ষণীয় যে আপনি যখন exclude()একাধিক পদ ব্যবহার করছেন তখন আপনি ORঅপারেটরের সাথে প্রস্তাবটি রচনা করতে চাইতে পারেন , যেমন exclude(Q(field1__queryop1=value1) | Q(field2__queryop2=value2))উভয় শর্তে ফলাফলগুলি বাদ দিতে।
ক্লাপা

98

জ্যাঙ্গো 1.7 দিয়ে একটি কাস্টম লুকআপ তৈরি করা সহজ। জ্যাঙ্গোর অফিসিয়াল ডকুমেন্টেশনে একটি দেখার __neউদাহরণ রয়েছে ।

আপনাকে প্রথমে অনুসন্ধানটি তৈরি করতে হবে:

from django.db.models import Lookup

class NotEqual(Lookup):
    lookup_name = 'ne'

    def as_sql(self, qn, connection):
        lhs, lhs_params = self.process_lhs(qn, connection)
        rhs, rhs_params = self.process_rhs(qn, connection)
        params = lhs_params + rhs_params
        return '%s <> %s' % (lhs, rhs), params

তারপরে আপনার এটি নিবন্ধন করতে হবে:

from django.db.models.fields import Field
Field.register_lookup(NotEqual)

এবং এখন আপনি __neএই জাতীয় আপনার প্রশ্নের মধ্যে চেহারা ব্যবহার করতে পারেন :

results = Model.objects.exclude(a=True, x__ne=5)

88

ইন জ্যাঙ্গো 1.9 / 1.10 তিনটি অপশন আছে।

  1. চেইন excludeএবংfilter

    results = Model.objects.exclude(a=true).filter(x=5)
  2. Q()অবজেক্টস এবং অপারেটর ব্যবহার করুন~

    from django.db.models import Q
    object_list = QuerySet.filter(~Q(a=True), x=5)
  3. একটি কাস্টম লুকিং ফাংশন নিবন্ধন করুন

    from django.db.models import Lookup
    from django.db.models.fields import Field
    
    @Field.register_lookup
    class NotEqual(Lookup):
        lookup_name = 'ne'
    
        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 <> %s' % (lhs, rhs), params

    জঙ্গো ১.৮-register_lookupসাজসজ্জারটি যুক্ত করা হয়েছিল এবং যথারীতি কাস্টম লুকআপ সক্ষম করে:

    results = Model.objects.exclude(a=True, x__ne=5)

1
OBJECT_LIST = QuerySet.filter (~ প্রশ্নঃ (ক সত্য =), এক্স = 5): সব অন্যান্য শর্ত তাহাদের ধারণকারী প্র: পর প্রশ্ন ধারণকারী রাখতে না করতে মনে রাখুন
ভূমি Singhal

1
@ মিশেলহফম্যান: ক) তারপরে আপনি Q~ ব্যবহার করে বর্জনের পরে একটি ছোট সেট ডেটাতে ফিল্টার করবেন তাই আরও দক্ষ। খ) সম্ভবত অন্যান্য উপায়ে সিকোয়েন্সিং কাজ করে না .. ডুন জানি .. ডান মনে আছে!
ভূমি সিংহল

41

মডেলের সঙ্গে তোমাদের সঙ্গে ফিল্টার করতে পারেন যদিও =, __gt, __gte, __lt, __lte, আপনি ব্যবহার করতে পারবেন না ne, !=বা <>। তবে আপনি কিউ অবজেক্টটি ব্যবহার করে আরও ভাল ফিল্টারিং অর্জন করতে পারেন।

আপনি শৃঙ্খলবদ্ধতা এড়াতে QuerySet.filter()এবং QuerySet.exlude(), এবং এটি ব্যবহার করতে পারেন:

from django.db.models import Q
object_list = QuerySet.filter(~Q(field='not wanted'), field='wanted')

24

মুলতুবি নকশা সিদ্ধান্ত। এদিকে, ব্যবহারexclude()

জাজানো ইস্যু ট্র্যাকারটির উল্লেখযোগ্য এন্ট্রি রয়েছে # 5763 , শিরোনাম "ক্যোরিসেটের" সমান নয় "ফিল্টার অপারেটর নেই । এটি লক্ষণীয় কারণ কারণ (এপ্রিল ২০১ of হিসাবে) এটি "9 বছর আগে খোলা হয়েছিল" (জাজানো পাথরের যুগে), "4 বছর আগে বন্ধ" এবং "সর্বশেষে 5 মাস আগে পরিবর্তন হয়েছিল" was

আলোচনার মাধ্যমে পড়ুন, এটি আকর্ষণীয়। মূলত, কিছু লোক যুক্তিযুক্ত __neহওয়া উচিত যখন অন্যরা বলেন exclude()পরিষ্কার হয় এবং তাই যুক্ত করা __ne উচিত নয়

(আমি পূর্বের সাথে একমত, কারণ পরের যুক্তিটি পাইথনের বলা মোটামুটি সমতুল্য !=কারণ এটি রয়েছে ==এবং notইতিমধ্যে ...)



18

আপনার ব্যবহার করা উচিত filterএবং এটি excludeপছন্দ করা উচিত

results = Model.objects.exclude(a=true).filter(x=5)

8

কোডের শেষ বিটটি সমস্ত অবজেক্টকে বাদ দেবে যেখানে x! = 5 এবং a সত্য। এটা চেষ্টা কর:

results = Model.objects.filter(a=False, x=5)

মনে রাখবেন, উপরের লাইনে থাকা = চিহ্নটি প্যারামিটার a কে মিথ্যা এবং পরামিতি x এর 5 নম্বর নির্ধারণ করছে। এটি সাম্যের জন্য পরীক্ষা করছে না। সুতরাং, ক্যোয়ারী কলটিতে! = চিহ্নটি ব্যবহার করার সত্যিই কোনও উপায় নেই।


3
এটি 100% একই জিনিস নয় কারণ এই ক্ষেত্রগুলির জন্য নাল মানও থাকতে পারে।
মাইকন

এটি কেবলমাত্র সেই আইটেমগুলিতেই প্রত্যাবর্তন করে যাগুলিতে = মিথ্যা এবং x = 5 রয়েছে তবে প্রশ্নটিতে একটি দৃষ্টান্ত (a = মিথ্যা, x = 4) অন্তর্ভুক্ত করা হবে।
রিমকো গ্রিলিচ

1
results = Model.objects.filter(a__in=[False,None],x=5)
জেরেমি

8

ফলাফল = Model.objects.filter (a = সত্য) .মুক্ত (x = 5)
এই বর্গাকার উত্পন্ন:
টেবিলেক্স থেকে * নির্বাচন করুন যেখানে a! = 0 এবং x! = 5
আপনার সত্য / মিথ্যা ক্ষেত্রটি কীভাবে উপস্থাপন করা হয় এবং ডেটাবেস ইঞ্জিনের উপর স্কুয়েল নির্ভর করে। Django কোড যদিও আপনার প্রয়োজন হয়।


8

জ্যাঙ্গো-মডেল-মানগুলি (প্রকাশ: লেখক) এই উত্তরের মতো নোটইক্যালের অনুসন্ধানের একটি বাস্তবায়ন সরবরাহ করে । এটি এর জন্য সিনট্যাক্টিক সহায়তাও সরবরাহ করে:

from model_values import F
Model.objects.exclude(F.x != 5, a=True)

6

আপনি যা সন্ধান করছেন তা হ'ল সমস্ত বস্তু যা হয় হয় a=false বা হয় x=5। জ্যাঙ্গো সালে |হিসেবে কাজ করে ORquerysets মধ্যে অপারেটর:

results = Model.objects.filter(a=false)|Model.objects.filter(x=5)

5

এটি আপনার কাঙ্ক্ষিত ফলাফল দেবে।

from django.db.models import Q
results = Model.objects.exclude(Q(a=True) & ~Q(x=5))

সমান না হওয়ার জন্য আপনি ~একটি সমান ক্যোয়ারিতে ব্যবহার করতে পারেন । স্পষ্টতই, Qসমান কোয়েরিতে পৌঁছানোর জন্য ব্যবহার করা যেতে পারে।


সম্পাদনা পরীক্ষা করুন; "এবং" ব্যবহার Q(a=True) and ~Q(x=5)করে তার পক্ষে ~Q(x=5)যুক্তি হিসাবে মূল্যায়ন করবে .exclude। দয়া করে পড়ুন: docs.python.org/3/references/expressions.html#boolean-operation এবং docs.python.org/3/references/…
tzot

2

এই প্রশ্নের প্রচুর ভুল উত্তর সন্ধান করুন!

জেরার্ডের যুক্তি সঠিক, যদিও এটি ক্যোয়ারসেটের পরিবর্তে একটি তালিকা (যা কিছু বিবেচনা না করে) ফিরিয়ে দেবে।

আপনার যদি ক্যোয়ারসেটের প্রয়োজন হয়, প্রশ্নটি ব্যবহার করুন:

from django.db.models import Q
results = Model.objects.filter(Q(a=false) | Q(x=5))
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.