404 ফেরত না দিয়ে যদি কোনও বস্তু জ্যাঙ্গো ভিউতে উপস্থিত থাকে তবে যাচাই করার সঠিক উপায় কী?


94

আমাকে কোনও বস্তু উপস্থিত রয়েছে কিনা তা যাচাই করতে হবে এবং সেই বস্তুটি ফিরিয়ে আনতে হবে, তারপরে সেই ক্রিয়াগুলি করে। 404 ফেরত না দিয়ে এটি করার সঠিক উপায় কী?

try:
    listing = RealEstateListing.objects.get(slug_url = slug)
except:
    listing = None

if listing:

রাসেল, আমি কি আপনাকে অন্য উত্তরটি গ্রহণ করার কথা বিবেচনা করার পরামর্শ দিতে পারি? এটি করার সঠিক উপায় বলে মনে হচ্ছে এটি গ্রহণযোগ্য উত্তরের চেয়ে বেশ কিছুটা উপরে উন্নীত হয়েছে।
আজেন্ডালে

4
আমি এটি বিবেচনা করতে পারি, তবে বিদ্যমান রয়েছে জঙ্গো ১.২-এ প্রকাশিত হয়েছিল যা ১ May ই মে ২০১০ প্রকাশিত হয়েছিল, আপনি যদি লক্ষ্য করেন যে আমার প্রশ্নটি ১৯৯৯ সালে জমা দেওয়া হয়েছিল ... তখন এটাই ছিল সঠিক উত্তর। যদি অস্তিত্বগুলি () এখন এটি করার সর্বোত্তম উপায় হিসাবে বিবেচিত হয়, তবে আমার ধারণা, দ্বিতীয় উত্তরটি বেছে নেওয়া অর্থহীনভাবে সঠিক হবে, তাই না?
রাসেল

রাসেল, এটি বোঝা যায় যে সেই সময়ে সঠিক উত্তর ছিল। তবে স্ট্যাকওভারফ্লো সাইটগুলি ভাল উত্তরগুলির সাথে ভাল / অফিসিয়াল প্রশ্নের একটি সেট তৈরি করার মতো বলে মনে হয়েছে কারণ সাইটগুলি মানুষের সমস্যার সমাধান খুঁজে পাচ্ছে। সুতরাং এখন "সরকারীভাবে সঠিক" উত্তরটি কী তা নির্বাচন করার জন্য আমার পরামর্শ।
আজানডালে

if listing:একটি হওয়া উচিত else:
ক্রনিকাল

উত্তর:


119

আপনাকে 404 না ​​দেওয়া হলে আমি 404 র‍্যাপার ব্যবহার করব না That এটি অভিপ্রায়টির অপব্যবহার। পরিবর্তে, কেবলমাত্র NoNotExist ধরুন।

try:
    listing = RealEstateListing.objects.get(slug_url=slug)
except RealEstateListing.DoesNotExist:
    listing = None

+1: হ্যাঁ, আপনি যদি 404 না ​​চান তবে এটি গৃহীত গৃহস্থের চেয়ে ভাল সমাধান
কার্ল মেয়ার

হ্যাঁ, এটি আরও ভাল সমাধান বলে মনে হচ্ছে
রাশিয়েল

4
এই বিষয়টির exists()সাথে আপনার কিছু করার প্রয়োজনের চেয়ে সমাধানটি আরও ভাল কাজ করে ।
সেক্স

4
আমি যোগ করতে চাই values_list('id', flat=True)। যদি আমার কেবল উপস্থিত আছে কিনা তা দেখার দরকার হয়listing = RealEstateListing.objects.values_list('id', flat=True).get(slug_url=slug)
ইরাজুয়ান

এই সিনট্যাক্সটি সম্পর্কে আমি কী অদ্ভুত মনে করি তা RealEstateListing.DoesNotExistহ'ল মডেলটিকে উল্লেখ করা হয়, এবং অবজেক্টটি নিজেই নয়। কেন হয় না RealEstateListing.objects.get(slug_url=slug).DoesNotExist?
ম্যাক্সিম ভালি

203

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

if not RealEstateListing.objects.filter(slug_url=slug).exists():
    # do stuff...

কখনও কখনও এটি try: except:ব্লক ব্যবহার করা আরও স্পষ্ট হয় এবং অন্য সময় ওয়ান-লাইনার exists()কোডটিকে আরও পরিষ্কার দেখায় ... সমস্ত কিছু আপনার অ্যাপ্লিকেশন যুক্তির উপর নির্ভর করে।



7
এটি সর্বোত্তম উপায় এবং এর উত্তরটি হওয়া উচিত
ঝাড়উড

4
আমি ধরে নিচ্ছি যে exists()কাজ করে না , তাই না get()?
এডুয়ার্ড লুকা

9
মনে রাখবেন যে আপনি যদি প্রশ্নটিতে বস্তুটি ব্যবহার না করে থাকেন তবে এই সমাধানটি বৈধ। অন্যথায় (ওপিএসের মতো) এটি ভুল এবং গৃহীত সমাধানের চেয়ে অনেক ধীর: আপনি যদি get()পরে এটি করেন, এটি ডাটাবেসে একটি দ্বিতীয় ক্যোয়ারী প্রেরণ করবে।
ক্রনিকাল

4
আপনি যদি অবজেক্টটি দিয়ে কিছু করার জন্য অস্তিত্বটি যাচাই করে থাকেন (যদি এটি বিদ্যমান থাকে) তবে আমি তার try-exceptচেয়ে বেশি পছন্দ করব exists()
Jithin Pavithran

7
listing = RealEstateListing.objects.filter(slug_url=slug).first() 

4
আপনার যদি পরে সম্ভাব্য বস্তুটি ব্যবহার করতে হয় তবে এটি সেরা সমাধান, কারণ এটির জন্য কেবলমাত্র একটি অ্যাসাইনমেন্ট প্রয়োজন, এবং এটি ব্লক ব্যতীত চেষ্টা করে / ব্যবহার করা এড়িয়ে চলে। নোট করুন যে আপনি অস্তিত্বের জন্য পরে কেবল পরীক্ষা করে দেখতে পারেনif listing:
মাইকেল

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

4
চেষ্টা / বাদে এবং ব্যবহার করে ইতিমধ্যে একটি সমাধান রয়েছে .exists()। আমি মনে করি যে জিনিসগুলি কীভাবে করা যায় তার একাধিক পৃথক উত্তর পাওয়া ভাল O হতে পারে এটি তাদের জন্য আরও ভাল যারা অবজেক্টটি বিদ্যমান থাকলে এটি ব্যবহার করতে চান। চেষ্টা / বাদ এড়াতে হবে বা করা উচিত না হলে আমি কোনও বিধি তৈরি করব না। কখনও কখনও এটি ভাল, এবং কখনও কখনও এটি উদাহরণস্বরূপ খারাপ হয় যদি আপনি কেবল খুব কমপ্যাক্ট কোড বানাতে চান।
হেনরিক হেইনো

0

আমি নিম্নলিখিত হিসাবে এটি সহজ করতে হবে:

listing = RealEstateListing.objects.filter(slug_url=slug)
if listing:
    # do stuff

আমি চেষ্টা / ধরার প্রয়োজন দেখছি না। যদি ফলাফলটিতে সম্ভাব্য কয়েকটি অবজেক্ট থাকে তবে ব্যবহারকারী হেনরিক হাইনো দেখানো হিসাবে প্রথমে () ব্যবহার করুন


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