জ্যাঙ্গো কোয়েরিতে আমি কীভাবে একটি ওআর ফিল্টার করব?


303

আমি যে আইটেমটি কোনও ব্যবহারকারী যুক্ত করেছেন (সেগুলি স্রষ্টার হিসাবে তালিকাভুক্ত করা হয়েছে) বা আইটেমটি অনুমোদিত হয়েছে তা তালিকাভুক্ত করতে চাই।

সুতরাং আমি মূলত নির্বাচন করা প্রয়োজন:

item.creator = owner or item.moderated = False

জাজানোতে আমি কীভাবে এটি করব? (সাধারণত একটি ফিল্টার বা ক্যোয়ারসেট সহ)

উত্তর:


544

Qজটিল অবলম্বনের অনুমতি দেয় এমন বস্তু রয়েছে। উদাহরণ:

from django.db.models import Q

Item.objects.filter(Q(creator=owner) | Q(moderated=False))

6
কীভাবে প্রোগ্রামটিমে এটি করা যায়? সুতরাং, উদাহরণস্বরূপ করতে সক্ষম for f in filters: Item.objects.filter(Q(creator=f1) | Q(creator=f2) | ...)
অ্যালেক্সিস

14
@ অ্যালেক্সিস্ক reduce(lambda q, f: q | Q(creator=f), filters, Q())বড় কিউ অবজেক্ট তৈরি করার মতো কিছু ব্যবহার করুন ।
ফোব

24
@ অ্যালেক্সিস: Item.objects.filter(creator__in=creators)উদাহরণস্বরূপ, আপনি এটি করতেও পারেন ।
কেভিন লন্ডন

4
আপনি যদি ভাবছেন (আমার মতো) কোথা |থেকে ওআর অপারেটর হিসাবে ব্যবহার করা হচ্ছে, এটি আসলে সেট ইউনিয়ন অপারেটর। : এটা এছাড়াও (এখানে নয়), bitwise হিসাবে ব্যবহার যাওয়া বা stackoverflow.com/questions/5988665/pipe-character-in-python
e100

124

আপনি | ব্যবহার করতে পারেন অপারেটর কিউ অবজেক্টগুলির প্রয়োজন ছাড়াই ক্যোয়ারসেটগুলি সরাসরি একত্রিত করতে:

result = Item.objects.filter(item.creator = owner) | Item.objects.filter(item.moderated = False)

(সম্পাদনা করুন - এটির কারণে কোনও অতিরিক্ত ক্যোয়ারী হয়েছে কিনা তা সম্পর্কে আমি প্রথমে অনিশ্চিত ছিলাম তবে @ স্পুকাইলুকি উল্লেখ করেছেন যে অলস ক্যোয়ারেট মূল্যায়ন এটির যত্ন নেয়)


4
প্রদত্ত অনুরোধে কোয়েরিগুলি কার্যকর করা হয় তা অনুসন্ধান করতে আপনি ডিবাগ-টুলবার জাঙ্গো অ্যাপ্লিকেশনটি ব্যবহার করতে পারেন। এটি দুর্দান্ত এবং জয় দিয়ে তৈরি।
ডেনিজ ডোগান

25
django.db আমদানি সংযোগ থেকে 'করুন এবং' কানেকশন.কুইরিস 'ব্যবহার করুন। এটির জন্য DEBUG = সত্য প্রয়োজন। বিটিডাব্লু , আপনার জানা উচিত যে ক্যোরিসেটগুলি অলস এবং এটি একবারে ডিবিতে আঘাত করে।
spookylukey

1
বাদ দেওয়া কি তুলনামূলক তুলনায় ব্যবহার করা যেতে পারে?
Neob91

2
এর ফলে ফলাফল ক্যোয়ারসেটে নকল হতে পারে?
চার্লস হারো

1
আরও সুনির্দিষ্টভাবে ক্যোয়ারী সেটগুলি কেবল তখনই আপনি ডিবিতে হিট হন যখন আপনি সেগুলিতে সূচি দেওয়ার চেষ্টা করেন, অন্যথায় আপনি কেবল একটি ক্যোয়ারী তৈরি করছেন।
awiebe

41

এটি লক্ষণীয় যে কিউ এক্সপ্রেশন যুক্ত করা সম্ভব ।

উদাহরণ স্বরূপ:

from django.db.models import Q

query = Q(first_name='mark')
query.add(Q(email='mark@test.com'), Q.OR)
query.add(Q(last_name='doe'), Q.AND)

queryset = User.objects.filter(query)

এটি এখানে একটি প্রশ্নের সাথে শেষ হয়:

(first_name = 'mark' or email = 'mark@test.com') and last_name = 'doe'

এইভাবে কোনও সমস্যা বা অপারেটরদের হ্রাস করার দরকার নেই , হ্রাস করা ইত্যাদি


2
তবে কি এটা লেখা সহজ query |= Q(email='mark@test.com')?
অ্যালেক্স 78191

26

আপনি ফিল্টারটিকে গতিশীল করতে চান তবে আপনাকে ল্যাম্বদা পছন্দ মতো ব্যবহার করতে হবে

from django.db.models import Q

brands = ['ABC','DEF' , 'GHI']

queryset = Product.objects.filter(reduce(lambda x, y: x | y, [Q(brand=item) for item in brands]))

reduce(lambda x, y: x | y, [Q(brand=item) for item in brands]) সমতুল্য

Q(brand=brands[0]) | Q(brand=brands[1]) | Q(brand=brands[2]) | .....

6
আমার জন্য নিখুঁত উত্তর! পাইথন 3 এর জন্য from functools import reduceআগেই করুন।
ধর্মিত

1
operator.or_পরিবর্তে ব্যবহার করবেন না কেন lambda x, y: x | y?
Alex78191

20

পুরানো আনসভেরার মতো, তবে ল্যাম্বডা ছাড়াই কিছুটা সহজ:

filter_kwargs = {
    'field_a': 123,
    'field_b__in': (3, 4, 5, ),
}

এই দুটি শর্ত ব্যবহার করে ফিল্টার করতে OR:

Item.objects.filter(Q(field_a=123) | Q(field_b__in=(3, 4, 5, ))

প্রোগ্রামিয়ালি একই ফলাফল পেতে:

list_of_Q = [Q(**{key: val}) for key, val in filter_kwargs.items()]
Item.objects.filter(reduce(operator.or_, list_of_Q))

(স্পষ্টতার জন্য এখানে দুটি লাইনে বিভক্ত)

operatorস্ট্যান্ডার্ড লাইব্রেরিতে রয়েছে: import operator
ডাস্ট্রিং থেকে:

or_ (a, b) - এক হিসাবে | খ।

পাইথন 3 এর জন্য এটি আর কোনও বিল্টিন reduceনয় তবে এখনও স্ট্যান্ডার্ড লাইব্রেরিতে রয়েছে:from functools import reduce


পুনশ্চ

list_of_Qখালি নয় তা নিশ্চিত করতে ভুলবেন না - reduce()খালি তালিকায় দম বন্ধ হয়ে যাবে, এর জন্য কমপক্ষে একটি উপাদান প্রয়োজন।


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