ข้อผิดพลาด Django - ไม่มีการค้นหาที่ตรงกัน


94

ในที่สุดฉันก็ปล่อยโปรเจ็กต์สู่ระดับการผลิตและทันใดนั้นฉันก็มีปัญหาบางอย่างที่ฉันไม่เคยต้องจัดการในขั้นตอนการพัฒนา

เมื่อผู้ใช้โพสต์การกระทำบางอย่างบางครั้งฉันก็ได้รับข้อผิดพลาดต่อไปนี้

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

สิ่งที่ทำให้ฉันผิดหวังจริงๆคือโครงการทำงานได้ดีในสภาพแวดล้อมท้องถิ่นและยิ่งไปกว่านั้นวัตถุแบบสอบถามที่ตรงกันยังมีอยู่ในฐานข้อมูล

ตอนนี้ฉันสงสัยว่าผู้ใช้กำลังเข้าถึงฐานข้อมูลเมื่อสงวนไว้สำหรับผู้ใช้รายอื่น แต่ไม่มีทางพิสูจน์ข้อโต้แย้งของฉันและฉันไม่มีทางแก้ไขใด ๆ

ใครเคยมีปัญหาแบบนี้มาก่อนหรือไม่? ข้อเสนอแนะเกี่ยวกับวิธีแก้ไขปัญหานี้หรือไม่?

ขอบคุณมากสำหรับความช่วยเหลือล่วงหน้า

แก้ไข: ฉันได้สืบค้นฐานข้อมูลด้วยตนเองโดยใช้ข้อมูลเดียวกันกับที่ดึงมาจากอีเมลแจ้งข้อผิดพลาดของเซิร์ฟเวอร์ที่ฉันได้รับ ฉันสามารถเข้าชมรายการได้โดยไม่มีปัญหาใด ๆ นอกจากนี้ดูเหมือนว่าพฤติกรรมเดียวกันทุกประการที่ผู้ใช้ทำไม่ได้ทำให้เกิดปัญหาใด ๆ เกือบตลอดเวลา แต่ในบางกรณี (ซึ่งยังไม่ทราบแน่ชัด) สรุปได้ว่าไม่มีปัญหากับรายการที่หายไปในฐานข้อมูลอย่างแน่นอน


2
เห็นได้ชัดว่ามันเป็นปัญหาของข้อมูล: comment = Comment.objects.get(pk=comment_id)ตรวจสอบ ID ที่มีอยู่ในฐานข้อมูล
karthikr

3
"python Manage.py sqlall" จะสร้าง SQL ที่ตรงกับโมเดลของคุณ ตรวจสอบว่าตรงกับ DB schema SQL หรือไม่ ตัวอย่างเช่นหากทำงานกับ PostgreSQL อาจเป็นปัญหาของลำดับ โดยสรุป: คุณสามารถนำข้อมูลเพิ่มเติมเกี่ยวกับสภาพแวดล้อมของคุณ (SQDB, DB, ตารางที่เกี่ยวข้องใน DB และรหัสใน models.py, ... )
Ricola3D

@ Ricola3D สวัสดี Ricola ฉันกำลังใช้ MySql DB ที่โฮสต์จากอินสแตนซ์ Amazon EC2 และฉันกำลังใช้ Django Comment ในตัวในขณะนี้ ในระหว่างนี้ฉันจะพยายามเรียกใช้คำสั่ง sqlall ที่คุณแนะนำ ขอบคุณ.
Chris P

คำตอบ:


98

บรรทัดของคุณเพิ่มข้อผิดพลาดอยู่ที่นี่:

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 ผ่านแท็บเก่าเกิดขึ้นกับฉันมากมาย
Yuji 'Tomita' Tomita

ขอบคุณคริสสำหรับข้อเสนอแนะ สิ่งที่ทำให้ฉันรำคาญจริงๆคือเมื่อฉันค้นหาฐานข้อมูล MySql ด้วยตนเอง (โดยใช้ข้อมูลข้อผิดพลาดที่ฉันได้รับจากเซิร์ฟเวอร์) ฉันกดรายการที่ถูกต้องโดยไม่มีปัญหาใด ๆ นอกจากนี้การกระทำเดียวกันบางครั้งอาจทำให้เกิดข้อยกเว้น DoesNotExist แต่ใช้งานได้เกือบตลอดเวลา ดูเหมือนว่าไม่มีปัญหากับรายการที่หายไปในฐานข้อมูล :(
Chris P

ฉันอาจมีผู้ใช้น้อยลง แต่ด้วย postgres ฉันไม่เคยมีปัญหาแบบนี้ เราไม่มีข้อมูลมากนักฐานข้อมูลของคุณไม่มี Slave / Master Clustering? คุณไม่ได้ใช้แคชในชุดแบบสอบถาม?
christophe31

@ christophe31 ดังนั้นฉันจึงยังไม่ได้ใช้การเพิ่มประสิทธิภาพการทำงานของ DB หรือวิธีการสำรองข้อมูลเช่น Slave / Master Clustering หรือการแคชบน Querysets ฉันเดาว่าฉันจะใช้คุณสมบัติเหล่านั้นและดูว่าปัญหายังคงมีอยู่หรือไม่
Chris P

2
นอกจากนี้คุณอาจจะเพิ่มในการจับ: from django.db import connection, connection.connection.close(), connection.connection = Noneพยายามที่จะตั้งค่าการเชื่อมต่อฐานข้อมูลและเริ่มต้นจากหนึ่งใหม่
christophe31

106

บางทีคุณอาจไม่มีบันทึกความคิดเห็นที่มีคีย์หลักดังกล่าวคุณควรใช้รหัสนี้:

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

24

คุณสามารถใช้สิ่งนี้:

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

ถ้ามีวัตถุเฉพาะที่คุณต้องการคุณจะไม่สามารถใช้ตัวกรองได้เนื่องจากอาจส่งคืนรายการว่างหากแบบสอบถามไม่ตรงกัน และเมื่อมันเข้ากันแล้วคุณต้องใช้วัตถุแรกจากรายการ
Jay Modi

3
น่าจะเป็นประเด็น: ใช้ตัวกรองและทดสอบว่าผลลัพธ์มีศูนย์หรือหนึ่งรายการแทนที่จะสร้างข้อยกเว้นหรือไม่?
Mike 'Pomax' Kamermans

ที่น่าสังเกตว่าModel.objects.filterจะส่งคืน Queryset ในขณะที่Model.objects.getจะส่งคืนวัตถุ หากไม่มีออบเจ็กต์ก่อนหน้านี้จะส่งคืนชุดคิวรีว่างเปล่าส่วนหลังจะทำให้เกิดModel.DoesNotExistข้อผิดพลาด
ron_g

Comment.objects.filter(pk=comment_id).first()จะกลับมาNoneหากไม่พบบันทึก
steezeburger

13

คุณอาจลองวิธีนี้ เพียงแค่ใช้ฟังก์ชันเพื่อรับวัตถุของคุณ

def get_object(self, id):
    try:
        return Comment.objects.get(pk=id)
    except Comment.DoesNotExist:
        return False
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.