Django डेटाबेस क्वेरी: आईडी द्वारा ऑब्जेक्ट कैसे प्राप्त करें?


105

Django स्वचालित रूप से प्राथमिक कुंजी के रूप में एक आईडी फ़ील्ड बनाता है।

अब मुझे इस आईडी द्वारा वस्तु प्राप्त करने की आवश्यकता है।

object = Class.objects.filter() 

इस फ़िल्टर को कैसे लिखें?

जवाबों:


179

यदि आप एक वस्तु प्राप्त करना चाहते हैं, तो उपयोग get()करना अधिक सरल है:

obj = Class.objects.get(pk=this_object_id)

18
FYI, pkकिसी भी मॉडल के लिए प्राथमिक कुंजी को संदर्भित करने का पसंदीदा तरीका है। idक्षेत्र केवल तभी मॉडल लेखक विशेष रूप से एक प्राथमिक कुंजी को नामित नहीं करता है उत्पन्न होता है। यदि लेखक ने एक प्राथमिक कुंजी फ़ील्ड निर्दिष्ट किया है जिसका नाम नहीं है id, तो कोई idफ़ील्ड नहीं होगा ।
क्रेग ट्रेडर

इसके अलावा FYI, idएक अंतर्निहित फ़ंक्शन में जो किसी ऑब्जेक्ट की पहचान लौटाता है। बहुमत के मामलों में चीजों को संदर्भित idकरने से सही काम होगा जैसे Class.objects.get(id=this_object_id)काम। लेकिन मुझे लगता है पर विचार करने के लिए कुछ है।
टॉम

15

मैं एक ही समस्या के लिए यहाँ आया था, लेकिन एक अलग कारण के लिए:

Class.objects.get(id=1)

यह कोड एक ImportError अपवाद को बढ़ा रहा था। जो मुझे भ्रमित कर रहा था वह यह था कि नीचे दिया गया कोड ठीक निष्पादित किया गया था और उम्मीद के मुताबिक परिणाम दिया गया था:

Class.objects.all()

get()विधि के लिए ट्रेसबैक की पूंछ :

File "django/db/models/loading.py", line 197, in get_models
    self._populate()
File "django/db/models/loading.py", line 72, in _populate
    self.load_app(app_name, True)
File "django/db/models/loading.py", line 94, in load_app
    app_module = import_module(app_name)
File "django/utils/importlib.py", line 35, in import_module
    __import__(name)
ImportError: No module named myapp

Django के अंदर कोड को पढ़ते हुए loading.py, मैं इस नतीजे पर पहुंचा कि settings.pyमेरे ऐप के लिए मेरा रास्ता खराब था जिसमें मेरी Classमॉडल की परिभाषा है। मुझे बस इतना करना था कि ऐप के लिए रास्ता सही था और get()विधि ठीक निष्पादित हुई।

यहाँ मेरा settings.pyसही रास्ता है:

INSTALLED_APPS = (
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.sites',
    # ...
    'mywebproject.myapp',

)

सभी भ्रम का कारण था क्योंकि मैं एक स्टैंडअलोन के रूप में Django के ORM का उपयोग कर रहा हूं, इसलिए नाम स्थान को प्रतिबिंबित करना पड़ा।


2

आप भी कर सकते हैं:

obj = ClassModel.get_by_id(object_id)

यह काम करता है, लेकिन मुझे यकीन नहीं है कि यह Django 2 में समर्थित है।


2

आप उपयोग कर सकते हैं:

objects_all=Class.objects.filter(filter_condition="")

यह एक क्वेरी सेट लौटा देगा भले ही वह एक वस्तु प्राप्त करे। यदि आपको वास्तव में एक वस्तु के उपयोग की आवश्यकता है:

obj=Class.objects.get(conditon="")

1

आप get_object_or_404 django शॉर्टकट का भी उपयोग कर सकते हैं । यदि ऑब्जेक्ट नहीं मिलता है तो यह 404 त्रुटि उठाता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.