2016-12-01 6 views
6

मेरे पास django exists() और DoesNotExist के बारे में कुछ प्रश्न हैं।Django मौजूद है() बनाम DoNotExist

उदाहरण कोड:

id = 1 
# first 
if User.objects.get(pk=id).exists(): 
    # my logic 
    pass 
# second 
try: 
    User.objects.get(pk=id) 
    # my logic 
    pass 
except User.DoesNotExist: 
    return 0 

मैं अक्सर get() विधि का उपयोग करें। कौन सा अभ्यास बेहतर है? कौन सा कोड बेहतर है? पहला या दूसरा?

+1

की संभावित डुप्लिकेट (http:

इसके अलावा, आप एक और दृष्टिकोण की कोशिश कर सकते // stackoverflow। कॉम/प्रश्न/23562784/क्या-अधिक-कुशल-ऑब्जेक्ट्स-फ़िल्टर-मौजूद है या प्राप्त करें और एक-कोशिश करें) – AKS

+0

'प्राप्त करें (पीके = आईडी) .exists()' _ _ काम नहीं करते हैं। यदि यह अस्तित्व में नहीं है, तो प्राप्त करें() अपवाद फेंक देगा। मौजूद है() केवल क्वेरीसेट के लिए काम करता है, प्राप्त करें() एक उदाहरण देता है जो एक क्वेरीसेट नहीं है। – RemcoGerlich

+0

ओह क्षमा करें() क्वेरीसेट विधि है। धन्यवाद –

उत्तर

4

अगर User.objects.get (पी = आईडी) .exists()

यह काम नहीं करेगा, तो सवाल का जवाब देने में बहुत आसान है: इस तरह के तरीके से हीन है जो काम करें :-)

मुझे लगता है कि आपने वास्तव में Minimal Complete Verifiable Example नहीं बनाया है और इसलिए आपने अन-सत्यापित कोड पोस्ट करते समय त्रुटि को याद किया।


बजाय, मैं तुम्हें के बीच अंतर के बारे में पूछ रहे हैं लगता है:

अंतर है:

  • QuerySet.exists विधि एक क्वेरीसमूह पर है, जिसका अर्थ है आप एक प्रश्न के बारे में यह पूछते हैं, और आप ("वहाँ किसी भी इस क्वेरी से मेल खाने उदाहरण हैं?") 'अभी तक कोई विशिष्ट उदाहरण पुनर्प्राप्त करने का प्रयास नहीं कर रहा है।

  • एक मॉडल के लिए DoesNotExist अपवाद उठाया है जब आप वास्तव में एक उदाहरण पुनः प्राप्त करने के का प्रयास किया, और यह मौजूद नहीं था।

जो भी कोई भी आपके इरादे को सही ढंग से व्यक्त करता है उसका उपयोग करें।

0

आप docs में अधिक जानकारी पा सकते हैं: के बारे में exists(), लेकिन exists() क्वेरीसमूह

रिटर्न यह सच है के लिए तभी काम करता है क्वेरीसमूह कोई भी परिणाम होते हैं, और झूठी नहीं तो। यह क्वेरी को सबसे सरल और तेज़ तरीके से निष्पादित करने का प्रयास करता है, लेकिन यह सामान्य क्वेरीसेट क्वेरी के समान क्वेरी को निष्पादित करता है।

मौजूद है() क्वेरीरीसेट में ऑब्जेक्ट सदस्यता और क्वेरीरीसेट में किसी ऑब्जेक्ट के अस्तित्व से संबंधित खोजों के लिए उपयोगी है, खासकर एक बड़ी क्वेरीसेट के संदर्भ में।

लेकिन ObjectDoesNotExist केवल get() के साथ काम करता है।[और क्या और अधिक कुशल .objects.filter (है) मौजूद है() या मिल() एक कोशिश।]

user = User.objects.filter(id=2) 
if user: 
    # put your logic 
    pass 
संबंधित मुद्दे