2012-08-12 112 views
5

我正在努力爲我在這裏要做的事情找出正確的解決方案,並非常感謝您的幫助。Django:get_object_or_404不是正確的解決方案,但是什麼?

目前,我有一個工作系統,從數據庫中獲取「特殊」並將其顯示在瀏覽器中。用戶可以在瀏覽器中編輯「特殊」並將其提交給數據庫。然後,該更改將顯示給用戶。

問題是如果數據庫中沒有預先存在的「Special」,「Special」不會更新。在我的views.py我有:

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') 

我知道,「特別」的更新不能正常工作的原因是因爲get_object_or_404正確返回404錯誤,因爲沒有預先存在的「特殊」在分貝。

我一直在嘗試一段時間來找出解決這個問題的最佳方法,而不會在數據庫中存在「特殊」情況下中斷功能。

到目前爲止,我已經試過tryexcept更換get_object_or_404,但我再碰上與保存功能問題,如'unicode' has no attribute 'save()'

回答

3

嘗試更換:

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

有:

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

或者你可以嘗試這樣的事:如果你需要做一些更與只是 -

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

創建對象。

編輯:

只是一個想法......這是一個令人費解的一點的型號發送到HttpResponse。也許你會想在HttpResponse中手動創建一個你想返回的字符串。當然,目前的代碼也適用。它隱含地調用模型的__unicode__方法。

另一件事 - 什麼是在return之前重新獲取myActiveSpecial的原因?我沒有看到這可能有任何影響。

+0

好了,現在我有: 'myActiveSpecial = SpecialOffer.objects。過濾器(產品= myProduct的).filter( 活躍= TRUE) 返回的HttpResponse(myActiveSpecial,MIME類型= 'text/plain的')' 但似乎團團轉 – Erve1879 2012-08-12 13:47:01

+0

你能更具體,什麼是去「圓圈「真的意味着什麼?此外,在我看來,你根本不需要重新獲取'myActiveSpecial'。 – frnhr 2012-08-12 14:08:11

+0

對不起 - 不是很具描述性!基本上,更改特殊的JS函數會正確返回新值,但新值不會保存在數據庫中。重新加載頁面後,顯示舊的特殊功能。如果您再嘗試再次更新特殊功能,它似乎將新的特殊功能添加到舊功能中......但仍然無法保存。 – Erve1879 2012-08-12 14:18:13

0

工作方式get_object_or_404的工作方式是通過傳入模型,然後進行一些查找。這與您所說的SpecialOffer.objects.get()相同,但不是引發異常,而是提高404

您第一次正確使用它,但不是第二次。

試試這個:

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 

您還可以使用反向查找技巧(取決於你的模型如何建立)。

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

我認爲'myActiveSpecial.exists()'在這種情況下會比'myActiveSpecial.count()'更好。 – yprez 2012-08-12 13:48:04

相關問題