5

我正在努力为我在这里尝试做的事情找出正确的解决方案,并且非常感谢一些帮助。

目前,我有一个工作系统,它从数据库中获取“特殊”并将其显示在浏览器中。用户可以在浏览器中编辑该“特殊”并将其提交到数据库。然后将该更改显示给用户。

问题是如果数据库中没有预先存在的“特殊”,则“特殊”将不会更新。在我的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 错误。

在数据库中存在现有“特殊”的情况下,我一直在尝试找出解决此问题的最佳方法,而不会破坏该功能。

到目前为止,我已经尝试用 and 替换get_object_or_404try但是except我遇到了保存功能的问题,例如'unicode' has no attribute 'save()'.

4

2 回答 2

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__模型的方法。

另一件事 - 重新获取myActiveSpecial之前的原因是return什么?我看不出这可能会产生什么影响。

于 2012-08-12T13:18:42.287 回答
1

工作方式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)
于 2012-08-12T13:28:00.630 回答