Django hatası - eşleşen sorgu mevcut değil


92

Sonunda projemi üretim seviyesine çıkardım ve bir anda geliştirme aşamasında uğraşmak zorunda olmadığım bazı sorunlar yaşadım.

Kullanıcılar bazı eylemler yayınladığında, bazen aşağıdaki hatayı alıyorum.

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

Beni gerçekten hayal kırıklığına uğratan şey, projenin yerel ortamda iyi çalışması ve ayrıca eşleşen sorgu nesnesinin Veritabanında mevcut olması.

Şimdi, diğer kullanıcılara ayrılmışken kullanıcının Veritabanına eriştiğinden şüpheleniyorum, ancak argümanımı kanıtlamanın bir yolu yok veya buna yönelik bir çözümüm yok.

Daha önce bu tür bir sorunu olan var mı? Bu sorunun nasıl çözüleceğine dair herhangi bir öneriniz var mı?

Şimdiden yardımlarınız için çok teşekkür ederim.

DÜZENLEME: Aldığım sunucu hatası e-postasından aldığım bilgilerin aynısını kullanarak veritabanını manuel olarak sorguladım. Herhangi bir sorun olmadan girişi vurmayı başardım. Ayrıca, kullanıcının gerçekleştirdiği aynı davranış çoğu zaman herhangi bir sorunu ortaya çıkarmıyor, bazı durumlarda (henüz bilinmeyen) durumlarda ortaya çıkıyor. Sonuç olarak, kesinlikle veri tabanındaki eksik giriş ile ilgili bir sorun değildir.


2
Açıkçası, bu bir veri konudur: comment = Comment.objects.get(pk=comment_id)id veritabanında mevcut doğrulamak
karthikr

3
"python manage.py sqlall", modellerinize karşılık gelen SQL'i oluşturacaktır. DB şema SQL'ine karşılık gelip gelmediğini kontrol edin. Örneğin PostgreSQL ile çalışıyorsanız, bu aynı zamanda bir sıra sorunu da olabilir. Sonuç olarak: ortamınız hakkında daha fazla bilgi verebilir misiniz (SQDB, DB, DB'deki ilgili tablo ve models.py'deki kod, ...)?
Ricola3D

@ Ricola3D Merhaba Ricola, Şu anda Amazon EC2 bulut sunucusundan barındıran MySql DB kullanıyorum. Ve şimdilik yerleşik Django Yorumunu kullanıyorum. Bu arada, önerdiğiniz sqlall komutunu çalıştırmaya çalışacağım. Teşekkür ederim.
Chris P

Yanıtlar:


97

hatayı yükselten satırınız burada:

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

var olmayan bir yoruma erişmeye çalışırsınız.

from django.shortcuts import get_object_or_404

comment = get_object_or_404(Comment, pk=comment_id)

Sunucunuzda bir hata olması yerine, kullanıcınız mevcut olmayan bir kaynağa erişmeye çalıştığı anlamına gelen bir 404 alacaktır.

Tamam buraya kadar sanırım bunun farkındasınız.

Bazı kullanıcılar (ve ben onların bir parçasıyım) sekmelerin uzun süre çalışmasına izin verir, eğer kullanıcılar verileri silme yetkisine sahipse, bu olabilir. 404 hatası, silinmiş bir kaynak hatasını işlemek için yöneticiye e-posta göndermekten daha iyi bir hata olabilir.

Diğer kullanıcılar, geçmişlerinden adreslere giderler (olabileceği için veriler silinmişse aynı).


3
Uzun süreli sekmelerde +1. Eski sekmeler üzerinden 404 bana çok şey oluyor.
Yuji 'Tomita' Tomita

Öneriniz için teşekkürler Chris. Beni gerçekten rahatsız eden şey, MySql veritabanını manuel olarak sorguladığımda (sunucudan aldığım hata bilgilerini kullanarak) herhangi bir sorun olmadan doğru girişi vurmam. Ayrıca, aynı eylem bazen DoesNotExist istisnası atar ancak çoğu zaman işe yarar. Veritabanındaki eksik girişle ilgili sorun gibi görünmüyor :(
Chris P

Daha az kullanıcım olabilir, ancak postgres ile bu tür sorunları hiç yaşamadım. Gerçekten çok fazla bilgimiz yok, veritabanınızda köle / ana kümeleme yok mu? Sorgu kümelerinde önbellek kullanmıyor musunuz?
christophe31

@ christophe31 Bu yüzden henüz herhangi bir tür DB performans optimizasyonu uygulamadım veya bağımlı / ana kümeleme veya sorgu kümelerinde önbelleğe alma gibi yöntemleri yedeklemedim. Sanırım bu özellikleri uygulayacağım ve sorunun devam edip etmediğini göreceğim.
Chris P

2
Ayrıca catch bu ekleyebiliriz: from django.db import connection, connection.connection.close(), connection.connection = Nonedb bağlantısı sıfırlamak ve yeni bir birinden başlatmaya çalışmak.
christophe31

106

Belki böyle bir birincil anahtara sahip bir Yorum kaydınız yoktur, o zaman bu kodu kullanmalısınız:

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

3
Bu gibi durumlarda en iyi seçenek. Kullanıcıya 404 atmak yerine, hatayı yakalayın ve önceden yapılandırılmış güzel bir mesaj gösterin. Kalp yanığı yok.
user12379095

Burada nasıl çalışır? def previous_job(self): return self.get_previous_by_start_dt(brand=self.brand, status='finished') or Nonetry catch burada nasıl uygulanacağını bilmiyorum
snh_nl

23

Bunu kullanabilirsiniz:

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

Peki, eğer istediğiniz belirli bir nesne varsa o zaman filtre kullanamazsınız, çünkü sorgu eşleşmezse boş liste döndürebilir. Ve eşleştiğinde, listedeki ilk nesneyi kullanmalısın.
Jay Modi

3
Muhtemelen mesele budur: bir istisna oluşturmak yerine filtre kullanın ve sonucun sıfır mı yoksa bir girdi mi olduğunu test edin?
Mike 'Pomax' Kamermans

Dikkati çekiyor Model.objects.filter, oysa bir sorgu kümesi döndürür Model.objects.getbir nesne döndürür. Nesne mevcut değilse, ilki boş bir sorgu kümesi döndürür, ikincisi bir Model.DoesNotExisthatayla sonuçlanır .
ron_g

Comment.objects.filter(pk=comment_id).first()Nonekayıt bulunmazsa dönecektir .
steezeburger

13

Bu şekilde deneyebilirsiniz. sadece nesnenizi elde etmek için bir işlev kullanın

def get_object(self, id):
    try:
        return Comment.objects.get(pk=id)
    except Comment.DoesNotExist:
        return False
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.