একটি ক্যোয়ারসেটে খালি বা নুল নামের জন্য ফিল্টারিং


463

আমার কাছে first_name, last_nameএবং alias(alচ্ছিক) যা অনুসন্ধান করা দরকার। সুতরাং, একটি উলামের সেট রয়েছে এমন সমস্ত নাম আমাকে দেওয়ার জন্য আমার একটি প্রশ্নের প্রয়োজন।

কেবলমাত্র যদি আমি করতে পারি:

Name.objects.filter(alias!="")

সুতরাং, উপরের সমতুল্য কি?

উত্তর:


839

আপনি এটি করতে পারেন:

Name.objects.exclude(alias__isnull=True)

যদি আপনাকে নাল মান এবং খালি স্ট্রিংগুলি বাদ দিতে হয় , তবে এটির জন্য পছন্দসই উপায় হল শর্তগুলি একসাথে চেইন করা:

Name.objects.exclude(alias__isnull=True).exclude(alias__exact='')

এই পদ্ধতিগুলিকে এক সাথে শৃঙ্খলাবদ্ধ করে প্রতিটি কন্ডিশনটি স্বাধীনভাবে চেক করা হয়: উপরের উদাহরণস্বরূপ, আমরা সারিগুলি বাদ দিই যেখানে aliasহয় নাল বা খালি স্ট্রিং রয়েছে, সুতরাং আপনি এমন সমস্ত Nameবস্তু পাবেন যা একটি নাল নয়, খালি নেই aliasfield উত্পন্ন এসকিউএল এর মতো দেখতে কিছু হবে:

SELECT * FROM Name WHERE alias IS NOT NULL AND alias != ""

আপনি একক কলটিতে একাধিক যুক্তিও সরবরাহ করতে পারেন exclude, যা নিশ্চিত করে যে কেবলমাত্র প্রতিটি শর্ত পূরণ করে এমন বস্তুগুলি বাদ দেওয়া হয়েছে:

Name.objects.exclude(some_field=True, other_field=True)

এখানে, যে সারিগুলিতে some_field এবং other_field সত্য সেগুলি বাদ দেওয়া হয়, সুতরাং আমরা উভয় ক্ষেত্রই সত্য নয় এমন সমস্ত সারি পাই। উত্পন্ন এসকিউএল কোডটি দেখতে কিছুটা এ জাতীয় দেখাচ্ছে:

SELECT * FROM Name WHERE NOT (some_field = TRUE AND other_field = TRUE)

বিকল্পভাবে, আপনার যুক্তি যদি এর চেয়ে জটিল হয় তবে আপনি জ্যাঙ্গোর কিউ অবজেক্ট ব্যবহার করতে পারেন :

from django.db.models import Q
Name.objects.exclude(Q(alias__isnull=True) | Q(alias__exact=''))

আরও তথ্যের জন্য এই পৃষ্ঠাটি এবং এই পৃষ্ঠাটি জ্যাঙ্গো ডক্সে দেখুন।

একদিকে যেমন: আমার এসকিউএল উদাহরণগুলি কেবল একটি সাদৃশ্য - আসল উত্পন্ন এসকিউএল কোড সম্ভবত অন্যরকম দেখবে। জ্যাঙ্গো কোয়েরিগুলি কীভাবে কাজ করে সে সম্পর্কে আপনি আরও গভীর উপলব্ধি পাবেন actually


5
আমি বিশ্বাস করি যে আপনার সম্পাদনাটি ভুল: চেইন ফিল্টার স্বয়ংক্রিয়ভাবে কোনও এসকিউএল তৈরি করে না OR(কেবলমাত্র এই ক্ষেত্রে), এটি একটি এসকিউএল উত্পাদন করে AND। রেফারেন্সের জন্য এই পৃষ্ঠাটি দেখুন: docs.djangoproject.com/en/dev/topics/db/queries/… শৃঙ্খলার সুবিধা হ'ল আপনি মিশ্রিত করতে পারেন excludeএবং filterজটিল প্রশ্নের শর্তগুলি মডেল করতে পারেন । আপনি যদি সত্যিকারের এসকিউএল মডেল করতে চান তবে ORআপনাকে অবশ্যই জ্যাঙ্গো কি অবজেক্টটি ব্যবহার করতে হবে: ডকস.ডজ্যাঙ্গোপ্রজেক্ট / জেন / দেব / টোপিক্স / ডিবি / কুইরিস / this অনুগ্রহ করে এটি সম্পাদন করার জন্য আপনার সম্পাদনাটি সম্পাদনা করুন, কারণ উত্তরটি মারাত্মকভাবে বিভ্রান্তিকর হিসাবে এটি দাঁড়িয়েছে ।
শেজি

1
@ শিজি: আমি এটিকে আরও সাদৃশ্য হিসাবে বোঝাতে চাইছিলাম - আমি এই কথাটি বোঝাতে চাইনি যে আসল এসকিউএল কোডটি ORশর্তটি ফিউজ করার জন্য কোনও ব্যবহারের নিশ্চয়তা রয়েছে । আমি পরিষ্কার করতে আমার উত্তর সম্পাদনা করব।
সাশা চেদিগোভ

1
মনে রাখবেন যে এই যুক্তিটি উপস্থাপন করার বিভিন্ন উপায় রয়েছে - উদাহরণস্বরূপ, NOT (A AND B)এর সমতুল্য NOT A OR NOT B। আমি মনে করি যে এটি নতুন জ্যাঙ্গো বিকাশকারীদের কাছে বিভ্রান্তিকর করে তোলে যারা এসকিউএল জানেন তবে ওআরএমের সাথে অপরিচিত।
শাশা চেদিগোভ

3
আমি ডি মরগান আইন জানেন, এবং এটি হল আমার বিন্দু ঠিক: আপনার উদাহরণ কেবলমাত্র তখনই কাজ এটি চালু সুবিধা নেয় কারণ ANDএকটি প্রথম ক্যোয়ারীতে ORকারণ আপনি ব্যবহার করছেন exclude। সাধারণ ক্ষেত্রে, এটা সম্ভবত একটি হিসাবে chaining মনে আরো সঠিক THEN, অর্থাত্ exclude(A) THEN exclude(B)। উপরে কঠোর ভাষা সম্পর্কে দুঃখিত। আপনার উত্তরটি সত্যই ভাল তবে নতুন বিকাশকারীরা আপনার উত্তরটি খুব সাধারণভাবে গ্রহণ করায় আমি উদ্বিগ্ন।
শেজি

2
@ শিজি: যথেষ্ট ফর্সা আমি সম্মত এটি জ্যাঙ্গো পদ এবং এসকিউএল পদ না মনে ভালো কথা, আমি ভেবেছিলাম পরিপ্রেক্ষিতে যে উপস্থাপনা chaining ANDএবং ORকেউ একটি SQL পটভূমি থেকে জ্যাঙ্গো করতে আসার জন্য সহায়ক হতে পারে। জ্যাঙ্গোর গভীর বোঝার জন্য, আমি মনে করি ডকগুলি আমার থেকে আরও ভাল কাজ করে।
সাশা চেদিগোভ

48
Name.objects.filter(alias__gt='',alias__isnull=False)

2
আমি নিশ্চিত নই, তবে আমি মনে করি alias__isnull=Falseশর্তটি অপ্রয়োজনীয়। যদি ক্ষেত্রটি Nullঅবশ্যই হয় তবে তা প্রথম দফায় বাদ দেওয়া হবে?
ববলে

আমার আগের মন্তব্য / প্রশ্ন বাদে আমি মনে করি এখানে ইতিবাচক যুক্তি অন্যান্য উত্তরগুলির তুলনায় অনুসরণ করা আরও সহজ।
ববলে

@ Bobble যে ডাটাবেস বাস্তবায়নের উপর নির্ভর করবে
অর্ডারটি ডেটাবেসে

alias__gtআমি কেবল JSON টাইপ কলামের জন্য কাজ করেছি যেখানে আমি JSON এর মতো খালি স্ট্রিংগুলি বাদ দিতে চেয়েছিলাম {'something:''}। কাজ করছে সিনট্যাক্সটি:jsoncolumnname__something__gt=''
বার্টগ্রাস

38

প্রথমত, জাজানো ডক্স চার্ফিল্ড বা টেক্সটফিল্ডের মতো স্ট্রিং-ভিত্তিক ক্ষেত্রগুলির জন্য NULL মানগুলি ব্যবহার না করার জোর পরামর্শ দেয় recommend ব্যাখ্যার জন্য ডকুমেন্টেশন পড়ুন:

https://docs.djangoproject.com/en/dev/ref/models/fields/#null

সমাধান: আপনি ক্যোরিসেটগুলিতে পদ্ধতিগুলি একসাথে চেইন করতে পারেন, আমার ধারণা। এটা চেষ্টা কর:

Name.objects.exclude(alias__isnull=True).exclude(alias="")

এটি আপনাকে যে সেটটি সন্ধান করছে তা দেওয়া উচিত।


5

জ্যাঙ্গো ১.৮ থেকে,

from django.db.models.functions import Length

Name.objects.annotate(alias_length=Length('alias')).filter(alias_length__gt=0)

5
এই "আপনার মত কিছু বলে মনে হয় করতে do", কিছু না করা উচিত না। এটি দুটি সাধারণ চেকের তুলনায় ক্যোয়ারির জটিলতার উল্লেখযোগ্যভাবে প্রস্ফুটিত হয়।
অলি

3

ব্যবহার করার সময় সাধারণ ভুল এড়াতে exclude, মনে রাখবেন:

আপনি একাধিক কন্ডিশন যুক্ত করতে () ব্লকের মতো বাদ দিতে পারবেন না । একাধিক শর্ত বাদ দিতে আপনার একাধিক বর্জন করতে হবে ()filter

উদাহরণ

ভুল :

ব্যবহারকারী.ওবজেক্টস.ফিল্টার (ইমেল='example@example.com ')।

সঠিক :

User.objects.filter (email='example@example.com ')। অগ্রাহ্য (profile__nick_name =' ')। অগ্রাহ্য (profile__avt =' ')


0

আপনি কেবল এটি করতে পারেন:

Name.objects.exclude(alias="").exclude(alias=None)

এটা সত্যিই সহজ। filterমেলতে ব্যবহৃত হয় এবং excludeসমস্ত কিছুর সাথে মিলে যায় যা এটি নির্দিষ্ট করে। এটি হিসাবে এসকিউএল হিসাবে মূল্যায়ন হবে NOT alias='' AND alias IS NOT NULL


এটি ভুল। প্রশ্নের লক্ষ্য কোয়েরি থেকে খালি ( alias="") এবং NULL ( alias=None) উপকরণগুলি বাদ দেওয়া । আপনার সাথে উদাহরণগুলি অন্তর্ভুক্ত থাকবে Name(alias=None)
দামান

@ ড্যামন - আমি জবাব দিচ্ছিলাম .filter(alias!="")শিরোনামের সমতুল্য তবে কী নয়? আমি আমার উত্তর সম্পাদনা করেছি। যাইহোক, অক্ষর ক্ষেত্রগুলি NULL মানগুলিকে অনুমতি দেয় না এবং একটি অ-মান (কনভেনশন অনুসারে) খালি স্ট্রিংটি ব্যবহার না করে।
টিম টিসডাল

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