জ্যাঙ্গোতে খালি ক্যোরিসেটের জন্য পরীক্ষা করা হচ্ছে


182

কোয়েরিতে কোনও ফল এসেছে কিনা তা যাচাই করার জন্য প্রস্তাবিত প্রতিমাটি কী?
উদাহরণ:

orgs = Organisation.objects.filter(name__iexact = 'Fjuk inc')
# If any results
    # Do this with the results without querying again.
# Else, do something else...

আমি মনে করি এটি চেক করার বিভিন্ন উপায় রয়েছে তবে আমি অভিজ্ঞ জাঙ্গো ব্যবহারকারী এটি কীভাবে করবেন তা জানতে চাই। দস্তাবেজের বেশিরভাগ উদাহরণ কেবল সেই ক্ষেত্রে উপেক্ষা করে যেখানে কিছুই পাওয়া যায় নি ...

উত্তর:


204
if not orgs:
    # Do this...
else:
    # Do that...

5
এটি ডকুমেন্টেশনেও অগ্রাধিকারপ্রাপ্ত বলে মনে হয়, উদাহরণস্বরূপ: ডকস.ডজ্যাঙ্গোপ্রজেক্ট /en/1.8/topics/http/shortcuts/#id7
ওয়াটওয়ার

1
@ উইটওয়ার আপনি যে কোডটি উল্লেখ করেছেন তাতে 404 বাড়াতে চুক্তি রয়েছে যদি ফিল্টারিং এক্সপ্রেশনটি কোনও রেকর্ড না আঘাত করে বা রেকর্ড রয়েছে তবে ফলাফলটির একটি উত্পাদন করতে পারে list। সেখানকার কোডটি একবারে ডাটাবেসে হিট হবে। যদি তারা ব্যবহার করে exist()বা count()প্রথমে রেকর্ডগুলি ফিরে আসবে কিনা তা পরীক্ষা করে দেখার জন্য, তারা দুবার ডাটাবেসটিকে আঘাত করবে (একবার চেক করতে হবে, একবার রেকর্ডগুলি পাওয়ার জন্য)। এটি একটি নির্দিষ্ট পরিস্থিতি। এটি কোনও জবাব দেয় না যে সাধারণ ক্ষেত্রে , কোনও ক্যোয়ারী রেকর্ডগুলি ফিরিয়ে দেবে কিনা তা জানতে পছন্দের পদ্ধতিটি করতে হবেif queryset:...
লুই

1
@ লুইস আমি যে কোডটি উল্লেখ করছি এটি কেবলমাত্র একটি উদাহরণ যা এতে if not my_objects:প্রমাণ করার জন্য একটি লাইন থাকে যে তারা ডক্সে এটি কীভাবে এটি করে। অন্য সবগুলি সম্পূর্ণ অপ্রাসঙ্গিক তাই আমি আপনার বক্তব্যটি পাই না। তারা পাশাপাশি এক হাজার প্রশ্ন তৈরি করতে পারে এবং এটি এখনও সম্পূর্ণ অপ্রাসঙ্গিক হবে কারণ এটি এই উত্তরটির মূল বিষয় নয়, যার সাথে আমি পরিষ্কার করে দিয়েছি যে আমি সম্মত।
ওয়াটওয়ার

1
@ ওয়াটওয়ার এটি কীভাবে কাজ করে তার একটি ব্যাখ্যা , ক্যোয়ারসেটে কোনও উপাদান উপস্থিত রয়েছে কিনা তা যাচাই করার পছন্দের উপায় নয় । ক্যোরিসেটে তালিকাটি () করা প্রতিটি ক্যোয়ারসেটে প্রতিটি অবজেক্ট আনবে, যা যদি অনেকগুলি সারি ফিরে আসে তবে দুবার জিজ্ঞাসা করার চেয়ে খারাপ হবে। get_object_or_404
minmaxavg

1
আরও বিস্তারিত উত্তরের জন্য নীচে @ লিওনিড-শ্বেচিকভের উত্তরটি দেখুন: কিউএস .exists()মূল্যায়ন না করা হলে ব্যবহার করা আরও কার্যকর।
সাহসী

191

সংস্করণ ১.২ থেকে, জ্যাঙ্গোর কাছে ক্যুরিসেট রয়েছে। বিদ্যমান () পদ্ধতি যা সবচেয়ে কার্যকর:

if orgs.exists():
    # Do this...
else:
    # Do that...

তবে আপনি যদি কোয়েরিসেটকে যাইহোক মূল্যায়ন করতে চলেছেন তবে এটি ব্যবহার করা ভাল:

if orgs:
   ...

আরও তথ্যের জন্য ক্যোরিসেট.এক্সেস্টিজ () ডকুমেন্টেশন পড়ুন


.exists () কেবলমাত্র ফিল্টার () এর জন্য, .get () এর জন্য কিছু আছে?
রোল করুন

.getএকটি ক্যোয়ারসেট ফেরত দেয় না। এটি একটি বস্তু ফেরত দেয়। সুতরাং এর জন্য গুগল করুন
অসীম

আপনার কাছে যদি একটি বৃহত কোয়েরীসেট থাকে তবে এটি কেবলমাত্র লক্ষণীয়ভাবে কার্যকর: ডকস.ডজ্যাঙ্গোপ্রজেক্ট
নাথন জোন্স

15

আপনার যদি বিপুল সংখ্যক অবজেক্ট থাকে তবে এটি (সময়ে সময়ে) আরও দ্রুত হতে পারে:

try:
    orgs[0]
    # If you get here, it exists...
except IndexError:
    # Doesn't exist!

একটি প্রকল্পে আমি একটি বিশাল ডাটাবেস নিয়ে কাজ করছি, not orgsএটি 400+ এমএস এবং orgs.count()250 মিমি। আমার সর্বাধিক প্রচলিত ব্যবহারের ক্ষেত্রে (ফলাফলগুলি যেখানে রয়েছে), এই কৌশলটি প্রায়শই তা কমিয়ে 20 মিমি হয়ে যায়। (একটি ক্ষেত্রে আমি পেয়েছি, এটি 6 ছিল।)

ফলস্বরূপ ডাটাবেসটি কতদূর যেতে পারে তার উপর নির্ভর করে অবশ্যই অনেক দীর্ঘ হতে পারে। বা আরও দ্রুত, যদি এটি দ্রুত খুঁজে পায়; YMMV।

সম্পাদনা: ফলাফলটি না পাওয়া গেলে এটি প্রায়শই ধীর হবেorgs.count() , বিশেষত যদি আপনি যে শর্তটি ফিল্টার করছেন সেটি বিরল পরিস্থিতি; ফলস্বরূপ, এটি দেখার ফাংশনগুলিতে বিশেষভাবে দরকারী যেখানে আপনার ভিউটি বিদ্যমান রয়েছে তা নিশ্চিত করতে বা এইচটিটিপি 404 নিক্ষেপ করতে হবে। (যেখানে কেউ আশা করবে, লোকেরা এমন ইউআরএল জিজ্ঞাসা করছে যা প্রায়শই বেশি উপস্থিত থাকে))


10

ক্যোরিসেটের শূন্যতা পরীক্ষা করতে:

if orgs.exists():
    # Do something

অথবা আপনি ক্যোয়ারসেটে প্রথম আইটেমটি পরীক্ষা করতে পারেন, এটি উপস্থিত না থাকলে এটি ফিরে আসবে None:

if orgs.first():
    # Do something

6
if orgs.exists()এই উত্তরটির প্রায় 5 বছর পূর্বে জবাব দেওয়া হয়েছিল covered এই উত্তরটি টেবিলে নিয়ে আসে যা সম্ভবত নতুন if orgs.first()। (এমনকি এটি বিতর্কযোগ্য: এটি প্রায় 5 বছর আগে orgs[0] প্রস্তাবিত করা থেকে যথেষ্ট আলাদা ?) আপনার উত্তরের সেই অংশটি বিকাশ করা উচিত: আগে প্রস্তাবিত অন্যান্য সমাধানগুলির পরিবর্তে কেউ কখন এটি করতে চাইবে ?
লুই

9

সর্বাধিক কার্যকর উপায় (জাজানো 1.2 এর আগে) এটি হ'ল:

if orgs.count() == 0:
    # no results
else:
    # alrigh! let's continue...

5
.exists () আরও বেশি কার্যকর বলে মনে হচ্ছে
ডিজিদা

5
এ ছাড়া .exists () আমার মন্তব্যের কয়েক মাস পরে যুক্ত করা হয়েছিল এবং j 8 মাস পরে জাজানো 1.2 (যা এপিআইতে অন্তর্ভুক্ত ছিল) প্রকাশিত হয়েছিল। তবে ডাউন-ভোটিং এবং সত্যতা যাচাইয়ের জন্য বিরক্ত না করার জন্য ধন্যবাদ।
বার্তোস্জ

4
দুঃখিত, আমি আপনার উত্তরে এটির চেয়ে ছোট সম্পাদনা যুক্ত করেছি এবং এটি ইতিবাচকভাবে ভোট দিয়েছি।
ডিজিদা

4

আমি প্রেডিটকের সাথে একমত নই

if not orgs:

এটা করা উচিত

if not orgs.count():

মোটামুটি বড় ফলাফল সেট (~ 150k ফলাফল) নিয়ে আমার একই সমস্যা ছিল। অপারেটর ক্যোরিসেটে অতিরিক্ত লোড হয় না, তাই ফলাফলটি চেকটি করার আগে একটি তালিকা হিসাবে প্রকৃতপক্ষে আনপ্যাক করা হয়। আমার ক্ষেত্রে মৃত্যুদন্ড কার্যকর করার সময়টি তিনটি আদেশে কমে যায়।


6
__nonzero__ ইতিমধ্যে ক্যোয়ারীসেটে ওভারলোড হয়েছে। যদি ফলাফলটি ক্যাশ না করা হয় (এটি কখনই ক্যোয়ারসেটের প্রথম ব্যবহারে হয় না) __nonzero__ এর আচরণটি ক্যোরিসেটে সমস্ত উপাদানকে পুনরাবৃত্তি করে। সেটটি বড় হলে এটি খুব খারাপ।
হেডলিওরোস

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