2012-08-12 23 views
5

Ben burada yapmak istediğim şey için doğru bir çözüm geliştirmek üzere mücadele ediyorum ve gerçekten yardıma takdir ediyorum. Şu anda Django: get_object_or_404 doğru çözüm değil, ne var?

, ben db bir "Özel" alır ve tarayıcıda görüntüleyen bir çalışma sistemi var. Kullanıcı tarayıcıdaki "Özel" i düzenleyebilir ve db’ye gönderebilir. Bu değişiklik kullanıcıya gösterilir.

sorun db hiçbir önceden varolan "Özel" varsa, "Özel" güncelleme olmayacak olmasıdır. Benim views.py ben vardır:

def changeSpecialOffer(theRequest): 
    myProductUuid = theRequest.POST['myProductUuid'] 
    myNewSpecialOffer = theRequest.POST['myNewSpecialOffer'] 
    myProduct = get_object_or_404(Product, uuid=myProductUuid) 
    myActiveSpecial = get_object_or_404(SpecialOffer.objects.filter(product=myProduct).filter(
                  active=True)) 
    try: 
     myActiveSpecial.special = myNewSpecialOffer 
     myActiveSpecial.save() 
    except: 
     return HttpResponse(myActiveSpecial, mimetype='text/plain') 
    myActiveSpecial = SpecialOffer.objects.filter(product=myProduct).filter(
                  active=True) 
    return HttpResponse(myActiveSpecial, mimetype='text/plain') 

Ben get_object_or_404 doğru bir 404 hatası döndürmesi nedeniyle hiçbir önceden varolan "Özel" Orada olduğu gibi "özel" güncellenmesi çalışmıyor sebebi olduğunu biliyoruz db.

ben db varolan "Özel" olduğu durumlarda işlevini bozmadan bu sorunu aşmanın en iyi yolu çalışmak için bir süre çalışıyorum.

Şimdiye kadar, ben try ve except ile get_object_or_404 yerine denedim ama o zaman böyle 'unicode' has no attribute 'save()' olarak kaydetmek fonksiyon sorunları, içine çalıştırın.

myActiveSpecial, just_created = SpecialOffer.objects.get_or_create(product=myProduct, active=True) 

Yoksa böyle bir şey deneyebilirsiniz:

myActiveSpecial = get_object_or_404(SpecialOffer.objects.filter(product=myProduct).filter(
                active=True)) 

ile:

cevap

3

deneyin yerine sen sadece- daha bir şeyler yapmak gerekiyorsa

try: 
    myActiveSpecial = SpecialOffer.objects.get(product=myProduct, active=True) 
except SpecialOffer.DoesNotExist: 
    myActiveSpecial = SpecialOffer.objects.create(product=myProduct, active=True, ...something.more...) 

oluşturulan nesne.

DÜZENLEME:

Sadece bir düşünce ... O HttpResponse bir Model göndermek için şaşırtıcı bir kısmı. Belki de HttpResponse içinde dönmek istediğiniz bir dize el ile oluşturmak isteyeceksiniz. Tabii ki, mevcut kod da çalışır. Modelinizin dolaylı olarak __unicode__ yöntemini çağırır.

Başka bir şey - myActiveSpecial'u return'dan hemen önce yeniden getirmenin nedeni nedir? Bunun sahip olabileceği herhangi bir etki görmüyorum.

+0

Tamam, şimdi de var: 'myActiveSpecial = SpecialOffer.objects.Filtre (ürün = myProduct) .filter ( aktif = True) dönüş HttpResponse (myActiveSpecial, mimetype = 'text/plain') ' Ama bu daha açık olabilir misin çevrelerinde – Erve1879

+0

yuvarlak gitmek gibi görünüyor," ne gidiyor çevrelerinde yuvarlak "gerçekten demektir? Ayrıca, bana 'myActiveSpecial' 'ı yeniden getirmeniz gerekmiyor. – frnhr

+0

Üzgünüz, çok açıklayıcı değil! Temel olarak, JS işlevini değiştirmek için yeni değeri doğru olarak döndürür, ancak yeni değer db'ye kaydetmez. Sayfayı yeniden yükledikten sonra eski özel gösterilir. Eğer daha sonra özel olanı tekrar güncellemeye çalışırsanız, yeni özel olanı eski olana ekler gibi görünüyor ... Ama yine de saklamıyor. – Erve1879

0

yolu get_object_or_404 eserler sonra bazı aramaları modelinde geçen ve gereğidir. SpecialOffer.objects.get() dediyseniz, ancak bir istisnayı yükseltmek yerine, 404'u yükseltir.

Doğru ilk kez kullandı, ancak ikinci örneği.

yerine bu deneyin:

myProduct = get_object_or_404(Product, uuid=myProductUuid) # this is correct 
myActiveSpecial = SpecialOffer.objects.filter(product=myProduct).filter(active=True)) 

if myActiveSpecial.count(): 
    # There is one or more active specials! 
else: 
    # There are no active specials for this product 

Ayrıca geriye doğru arama hile dosyaları (modeller kurmak nasıl bağlı olarak).

myActiveSpecial = myProduct.specialoffer_set.filter(active=True) 
+1

oluşturmaya ayarlanmayan "etkin" değeriyle bir ilgisi olduğunu düşünüyorum. Bu durumda "myActiveSpecial.exists()" ifadesi, myActiveSpecial.count() 'dan daha iyi olacaktır. – yprez

İlgili konular