2009-03-12 17 views
63

temel olarak sadece bir nesnenin var olup olmadığını doğrulayın ve nesneyi döndürün. daha sonra buna dayalı eylemleri gerçekleştirin. 404'e dönmeden doğru yolu yapmanın ne olduğunu merak ediyorum. Eğer niyet yanlış olan bir 404. verilmediği takdirde404 döndürmeden django görünümünde bir nesne olup olmadığını doğrulamanın doğru yolu nedir?

try: 
    listing = RealEstateListing.objects.get(slug_url = slug) 
except: 
    listing = None 

if listing: 
+0

Rasiel, diğer cevabı kabul etmeyi düşünebilir misiniz? Bunu yapmak için doğru bir yol gibi görünüyor ve kabul edilen cevaptan biraz daha fazla ayrıldı. – Azendale

+0

Bunu göz önünde bulundurabilirim, ancak 17 Mayıs 2010'da çıkmış olan Django 1.2'de var. Sorunun 09'da gönderildiğini fark ederseniz ... bu doğru cevaptı. Varsa() şimdi bunu yapmanın en iyi yolu olarak kabul edilirse, sanırım ikinci cevabı seçmek anlamsal olarak doğru olur, değil mi? – Rasiel

+0

Rasiel, o zamanın doğru cevap olduğunu anlamıştı. Ancak, stackoverflow siteleri, sitelerin insanların sorunlarına çözüm buldukça, en iyi cevaplarla iyi/resmi sorulardan oluşan bir set oluşturmaya çok benziyor. Bu yüzden şimdi "resmen doğru" cevabı seçmek için benim önerim. – Azendale

cevap

86

404 sarmalayıcı kullanmak ister. Bunun yerine, DoesNotExist'i yakalamanız yeterlidir. Daha net görünümlü kodu yapar) blok ve tek satırlık var diğer zamanlarda (... tüm bağlıdır: hariç:

try: 
    listing = RealEstateListing.objects.get(slug_url=slug) 
except RealEstateListing.DoesNotExist: 
    listing = None 
+0

+1: Bunu, 404 sarmalayıcı yerine da kullanırdım. – Tiago

+0

+1: Evet, bu kabul edilen olandan daha iyi bir çözümdür, eğer 404'ü istemiyorsan –

+0

yap, bu daha iyi bir çözüm gibi görünüyor – Rasiel

141

Ayrıca Bazen denemek kullanmak daha açık

if not RealEstateListing.objects.filter(slug_url=slug).exists(): 
    do stuff... 

yapabilirsiniz uygulama mantığı.

+6

.exists() daha hızlıdır: https: //docs.djangoproject .com/tr/dev/ref/models/querysets/# mevcut – fjsj

+5

Bu daha iyi bir yoldur ve cevabın – Jharwood

+0

olması gerekir Ben bunu denemekten çok daha fazlası/ – robbyt

2
listing = RealEstateListing.objects.filter(slug_url=slug).first() 
+0

Potansiyel nesneyi daha sonra kullanmanız gerektiğinde bu en iyi çözümdür, çünkü sadece bir ödev gerektirir ve bir try/except bloğu kullanmak zorunda kalmaz. Varlığınızı daha sonra basitçe 'eğer listeleniyorsa:' ile test edebildiğinizi unutmayın. –