Django त्रुटि - मिलान क्वेरी मौजूद नहीं है


98

मैंने आखिरकार अपनी परियोजना को उत्पादन स्तर पर जारी कर दिया और अचानक मेरे पास कुछ मुद्दे हैं जिन्हें मुझे विकास के चरण में कभी नहीं निपटना पड़ा।

जब उपयोगकर्ता कुछ कार्य पोस्ट करते हैं, तो मुझे कभी-कभी निम्न त्रुटि मिलती है।

Traceback (most recent call last):

  File "/usr/local/lib/python2.7/dist-packages/django/core/handlers/base.py", line 111, in get_response
    response = callback(request, *callback_args, **callback_kwargs)

  File "home/ubuntu/server/opineer/comments/views.py", line 103, in comment_expand
    comment = Comment.objects.get(pk=comment_id)

  File "/usr/local/lib/python2.7/dist-packages/django/db/models/manager.py", line 131, in get
    return self.get_query_set().get(*args, **kwargs)

  File "/usr/local/lib/python2.7/dist-packages/django/db/models/query.py", line 366, in get
    % self.model._meta.object_name)

DoesNotExist: Comment matching query does not exist

क्या वास्तव में मुझे निराशा होती है कि परियोजना स्थानीय वातावरण में ठीक काम करती है और इसके अलावा, डेटाबेस में मेल क्वेरी ऑब्जेक्ट DOES मौजूद है।

अब मुझे संदेह है कि उपयोगकर्ता डेटाबेस तक पहुँच रहा है जब यह अन्य उपयोगकर्ताओं के लिए आरक्षित है, लेकिन मेरे तर्क को साबित करने का कोई तरीका नहीं है और न ही मेरे पास इसका कोई समाधान है।

किसी को भी इस तरह का मुद्दा पहले था? इस मुद्दे को हल करने के बारे में कोई सुझाव?

आपकी मदद के लिए अग्रिम धन्यवाद।

संपादित करें: मैंने स्वयं प्राप्त सर्वर त्रुटि ईमेल से प्राप्त जानकारी का उपयोग करके डेटाबेस को मैन्युअल रूप से क्वेरी किया है। मैं बिना किसी मुद्दे के एंट्री मारने में सफल रहा। इसके अलावा, ऐसा लगता है कि ठीक उसी तरह का व्यवहार जो उपयोगकर्ता ने किया है वह ज्यादातर समय किसी भी मुद्दे को नहीं उठाता है, बल्कि कुछ (जो अभी तक अज्ञात है) मामलों में नहीं है। निष्कर्ष में, यह निश्चित रूप से डेटाबेस में लापता प्रविष्टि के साथ एक मुद्दा नहीं है।


2
स्पष्ट रूप से, यह एक डेटा समस्या है: comment = Comment.objects.get(pk=comment_id)सत्यापित करें कि आईडी डेटाबेस में मौजूद है
karthikr

3
"python manage.py sqlall" SQL आपके मॉडल के अनुरूप उत्पन्न करेगा। जांचें कि क्या यह DB स्कीमा SQL से मेल खाता है। यदि उदाहरण के लिए PostgreSQL के साथ काम करना, यह अनुक्रम का मुद्दा भी हो सकता है। निष्कर्ष में: क्या आप अपने पर्यावरण के बारे में अधिक जानकारी (SQDB, DB, DB में संबंधित सारणी और मॉडलशो में कोड, ...) ला सकते हैं?
रिकोला 3 डी

@ Ricola3D हैलो रिकोला, मैं वर्तमान में MySql DB का उपयोग कर रहा हूँ इसे Amazon EC2 उदाहरण से होस्ट कर रहा हूँ। और मैं फिलहाल Django टिप्पणी में निर्मित का उपयोग कर रहा हूं। इस बीच, मैं आपके द्वारा सुझाए गए sqlall कमांड को चलाने का प्रयास करूंगा। धन्यवाद।
क्रिस पी।

जवाबों:


105

आपकी लाइन त्रुटि को बढ़ा रही है:

comment = Comment.objects.get(pk=comment_id)

आप एक गैर-मौजूदा टिप्पणी तक पहुँचने का प्रयास करते हैं।

from django.shortcuts import get_object_or_404

comment = get_object_or_404(Comment, pk=comment_id)

आपके सर्वर पर एक त्रुटि होने के बजाय, आपके उपयोगकर्ता को 404 अर्थ मिलेगा कि वह एक गैर मौजूदा संसाधन तक पहुंचने का प्रयास करता है।

ठीक है यहां तक ​​कि मुझे लगता है कि आप इसके बारे में जानते हैं।

कुछ उपयोगकर्ता (और मैं उनका हिस्सा हूं) टैब को लंबे समय तक चलने दें, यदि उपयोगकर्ता डेटा को हटाने के लिए अधिकृत हैं, तो ऐसा हो सकता है। व्यवस्थापक को ईमेल भेजने की तुलना में हटाए गए संसाधन त्रुटि को संभालने के लिए 404 त्रुटि एक बेहतर त्रुटि हो सकती है।

अन्य उपयोगकर्ता अपने इतिहास से पते पर जाते हैं, (यदि ऐसा होने के बाद से डेटा हटा दिया गया है)।


3
लंबे चलने वाले टैब पर +1। पुराने टैब के माध्यम से 404 मेरे लिए बहुत कुछ होता है।
युजी 'टमिता' टॉमिता

आपके सुझाव के लिए धन्यवाद क्रिस। वास्तव में मुझे परेशान करने वाली बात यह है कि जब मैं MySql डेटाबेस को मैन्युअल रूप से क्वेरी करता हूं (सर्वर से प्राप्त त्रुटि जानकारी का उपयोग करके) मैं बिना किसी समस्या के सही प्रविष्टि को हिट करता हूं। इसके अलावा, एक ही क्रिया कभी-कभी DoNotExist अपवाद को भी फेंक देती है, लेकिन अधिकांश समय काम करती है। यह डेटाबेस में लापता प्रविष्टि के साथ समस्या की तरह नहीं लगता है :(
क्रिस पी।

मेरे पास कम उपयोगकर्ता हो सकते हैं, लेकिन पोस्टग्रेज के साथ मुझे इस तरह की समस्याएं कभी नहीं हुईं। हमारे पास वास्तव में बहुत सी जानकारी नहीं है, आपके डेटाबेस में दास / मास्टर क्लस्टरिंग नहीं है? आप क्वेरी पर कैश का उपयोग नहीं करते हैं?
क्रिस्टोफ

@ christophe31 तो मैंने अभी तक किसी भी प्रकार के DB प्रदर्शन अनुकूलन को लागू नहीं किया है और न ही स्लैव / मास्टर क्लस्टरिंग या क्वेरीसेट पर कैशिंग जैसे तरीकों का उपयोग किया है। मुझे लगता है कि मैं उन विशेषताओं को लागू करूंगा और देखूंगा कि क्या समस्या बनी रहती है।
क्रिस पी।

2
इसके अलावा, आप पकड़ में इस जोड़ सकते हैं: from django.db import connection, connection.connection.close(), connection.connection = Noneडाटाबेस कनेक्शन रीसेट और एक नया से प्रारंभ करने का प्रयास करने के लिए।
क्रिस्तोफे

112

शायद आपके पास ऐसी प्राथमिक कुंजी के साथ कोई टिप्पणी रिकॉर्ड नहीं है, तो आपको इस कोड का उपयोग करना चाहिए:

try:
    comment = Comment.objects.get(pk=comment_id)
except Comment.DoesNotExist:
    comment = None

3
ऐसे मामलों में सबसे अच्छा विकल्प। उपयोगकर्ता पर 404 को फेंकने के बजाय, त्रुटि को पकड़ें और एक अच्छा पूर्व-निर्धारित संदेश प्रदर्शित करें। दिल नहीं जलता।
user12379095

यह यहां कैसे काम करेगा? def previous_job(self): return self.get_previous_by_start_dt(brand=self.brand, status='finished') or Noneयहाँ पकड़ने की कोशिश को लागू करने के लिए पता नहीं है
snh_nl

26

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

comment = Comment.objects.filter(pk=comment_id)

ठीक है, यदि कोई विशिष्ट वस्तु है जो आप चाहते हैं तो आप फ़िल्टर का उपयोग नहीं कर सकते क्योंकि यह खाली सूची वापस कर सकता है यदि क्वेरी मेल नहीं खाती। और जब यह मेल खाता है तो आप सूची से पहली वस्तु का उपयोग करेंगे।
जय मोदी

3
संभवत: वह बिंदु है: फ़िल्टर और परीक्षण का उपयोग करें कि क्या परिणाम एक अपवाद उत्पन्न करने के बजाय शून्य या एक प्रविष्टि है?
माइक 'पोमैक्स' कामेरमेंस

वर्थ नोटिंग जो Model.objects.filterएक क्वेरीसेट लौटाएगा, जबकि Model.objects.getएक ऑब्जेक्ट वापस करेगा। यदि ऑब्जेक्ट मौजूद नहीं है, तो पूर्व एक खाली क्वेरी लौटाएगा, बाद में एक Model.DoesNotExistत्रुटि होगी।
रोन_ग

Comment.objects.filter(pk=comment_id).first()Noneयदि कोई रिकॉर्ड नहीं मिला है तो वापस आ जाएगा ।
स्टेइजबर्गर

15

आप इस तरह से कोशिश कर सकते हैं। बस अपनी वस्तु पाने के लिए एक फ़ंक्शन का उपयोग करें

def get_object(self, id):
    try:
        return Comment.objects.get(pk=id)
    except Comment.DoesNotExist:
        return False
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.