জ্যাঙ্গো ক্যোয়ারসেটে ওআর শর্তটি কীভাবে সম্পাদন করবেন?


293

আমি এই এসকিউএল কোয়েরির সমান একটি জ্যাঙ্গো কোয়েরি লিখতে চাই:

SELECT * from user where income >= 5000 or income is NULL.

জ্যাঙ্গো ক্যোয়ারেট ফিল্টারটি কীভাবে তৈরি করবেন?

User.objects.filter(income__gte=5000, income=0)

এটি কাজ করে না, কারণ এটি ANDফিল্টারগুলি। আমি ORপৃথক ক্যোয়ারসেটগুলির ইউনিয়ন পেতে ফিল্টারগুলিতে চাই।


উত্তর:


547
from django.db.models import Q
User.objects.filter(Q(income__gte=5000) | Q(income__isnull=True))

ডকুমেন্টেশন মাধ্যমে


আপনি অবজেক্ট.কোয়ারির একটি মুদ্রণ যুক্ত করলে এটি সহায়তা করবে যাতে এটির সাথে পরিচিত হওয়ার জন্য আমরা ওআরএম এবং ক্যোয়ারী উভয়ই আউটপুট সম্পর্কিত করতে পারি। বিটিডব্লিউর দুর্দান্ত উদাহরণ।
— এডউইন পাজ

এই ধরণের ক্যোয়ারী ব্যবহার করা বা দুটি পৃথক কোয়েরি করা কি ভাল?
— এমএইচবি

60

কারণ কোয়েরিসেটগুলি পাইথন __or__অপারেটর ( |) বা ইউনিয়ন বাস্তবায়ন করে , এটি কেবল কাজ করে। আপনি আশা করতে চাই যে, |বাইনারি অপারেটর একটি ফেরৎ QuerySetতাই order_by(), .distinct(), এবং অন্যান্য queryset ফিল্টার শেষ নেভিগেশন tacked করা যেতে পারে।

combined_queryset = User.objects.filter(income__gte=5000) | User.objects.filter(income__isnull=True)
ordered_queryset = combined_queryset.order_by('-income')

2019-06-20 আপডেট করুন: এটি এখন পুরো জাজানো 2.1 কোয়েরিसेट এপিআই রেফারেন্সে ডকুমেন্টেড । আরও historic তিহাসিক আলোচনা জাজানোপ্রজ টিকিট # 21333 এ পাওয়া যাবে ।


18
"অপ্রকাশিত" এবং "উত্তরাধিকার" আমাকে ভয় দেখায়। আমি মনে করি এটি এখানে গৃহীত উত্তরে বিস্তারিত হিসাবে Q অবজেক্টটি ব্যবহার করা নিরাপদ।
— 0atman

2
অবগতির জন্য, order_by () এবং স্বতন্ত্র () পাইপ queryset প্রয়োগ করা যেতে পারে পরে তারা একত্রিত করা হয়
— carruthd

@ ক্যারথযুক্ত ধন্যবাদ। আমি এটিও নিশ্চিত করেছিলাম। সম্পাদনা করবে
— hobs

অর্ডার_বি () কে প্রতিটি পৃথক ক্যোয়ারসেটে প্রয়োগ করা যায় এবং তারপরে সংযুক্ত করা যায়? যাতে প্রতিটি শর্তের ক্রমটি এখনও বজায় থাকে? উদাহরণস্বরূপ, মিলিত_কোয়রিসেট = ব্যবহারকারী.ওবজেক্টস.ফিল্টার (আয়__জিটি = 5000) .অর্ডার_বি ('আয়') | ইউজার.ওবজেক্টস.ফিল্টার (আয়__লট = 5000) .অর্ডার_বি ('- আয়')?
— অচলাবস্থা

2
@ ওটম্যান: | অপারেটর নথিভুক্ত করা হয়। ডকস.ডজ্যাঙ্গোপ্রজেক্ট.এইন / ২.০ / রিজ / মডেলস / ক্যুরিসেটস দেখুন : "সাধারণভাবে, প্রশ্ন () অবজেক্টগুলি শর্তগুলি সংজ্ঞায়িত ও পুনরায় ব্যবহার করা সম্ভব করে। এটি | (ওআর) এবং & ( এবং) অপারেটরগুলি; বিশেষত, ক্যোয়ারীসেটগুলিতে ওআর ব্যবহার করা অন্যথায় সম্ভব নয় "" আমি পূর্ববর্তী সংস্করণগুলির জন্য ডকুমেন্টেশন চেক করিনি তবে পাইপ অপারেটর কমপক্ষে জাজানো 1.1.4 থেকে কাজ করে (কেবল চেষ্টা করেছে))
— মেকারু

10

উভয় বিকল্প ইতিমধ্যে বিদ্যমান উত্তরে উল্লেখ করা হয়েছে:

from django.db.models import Q
q1 = User.objects.filter(Q(income__gte=5000) | Q(income__isnull=True))

এবং

q2 = User.objects.filter(income__gte=5000) | User.objects.filter(income__isnull=True)

তবে কোনটি পছন্দ করা উচিত তা নিয়ে কিছুটা বিভ্রান্তি রয়েছে বলে মনে হয়।

মুল বক্তব্যটি হ'ল এসকিউএল স্তরে এগুলি অভিন্ন , তাই আপনি যা পছন্দ করুন তা নির্দ্বিধায় নিন!

জ্যাঙ্গো ORM Cookbook এই সম্পর্কে কিছু বিস্তারিতভাবে আলোচনা, এখানে প্রাসঙ্গিক অংশ:


queryset = User.objects.filter(
        first_name__startswith='R'
    ) | User.objects.filter(
    last_name__startswith='D'
)

দিকে

In [5]: str(queryset.query)
Out[5]: 'SELECT "auth_user"."id", "auth_user"."password", "auth_user"."last_login",
"auth_user"."is_superuser", "auth_user"."username", "auth_user"."first_name",
"auth_user"."last_name", "auth_user"."email", "auth_user"."is_staff",
"auth_user"."is_active", "auth_user"."date_joined" FROM "auth_user"
WHERE ("auth_user"."first_name"::text LIKE R% OR "auth_user"."last_name"::text LIKE D%)'

এবং

qs = User.objects.filter(Q(first_name__startswith='R') | Q(last_name__startswith='D'))

দিকে

In [9]: str(qs.query)
Out[9]: 'SELECT "auth_user"."id", "auth_user"."password", "auth_user"."last_login",
 "auth_user"."is_superuser", "auth_user"."username", "auth_user"."first_name",
  "auth_user"."last_name", "auth_user"."email", "auth_user"."is_staff",
  "auth_user"."is_active", "auth_user"."date_joined" FROM "auth_user"
  WHERE ("auth_user"."first_name"::text LIKE R% OR "auth_user"."last_name"::text LIKE D%)'

উত্স: django-orm- কুকবুক


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