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


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.