2012-08-12 85 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

相关问题